--- a
+++ b/impnotes.html
@@ -0,0 +1,9567 @@
+<!doctype html public "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+<title>CLISP implementation notes</title>
+<meta name="author" content="Bruno Haible">
+<meta name="keywords" content="Lisp, Common Lisp, CLISP">
+<link rev=made href="mailto:clisp-list@lists.sourceforge.net">
+</head>
+
+<!-- todo: Add symbol index -->
+
+<!-- rules for this file:
+  * Use only HTML 3.2 commands which work in a large range of browsers.
+  * For references to the CL HyperSpec, use "CLHSROOT". It is later replaced
+    with a URL like
+    "http://www.harlequin.com/education/books/HyperSpec" or
+    "file:/usr/doc/lisp/HyperSpec" by sed(1) during installation. In
+    order to view this file without sed-processing it, it is sufficient
+    to make a symlink for "CLHSROOT" in the current directory.
+  * "Whatever is written by a human, will be read by another human".
+    Please keep your lines under 79 characters and remember that some
+    people will be reading this document with "CLHSROOT" replaced with a
+    long URL.
+  * For the benefit of Emacs, put 2 spaces after a final period in a sentence.
+  * Literal symbols are written in <code>...</code> font, in lowercase.
+  * All tags are written in lowercase (which is more readable for a
+    human).  "Low level" tags like <b> and <i> etc are to be avoided,
+    please use logical tags like <strong> and <em> instead.
+  * At the definition point of a symbol, this symbol is written as
+    <code><strong>...</strong></code>.
+  * All symbols in CLHS are referenced with an "CLHSROOT" hyperlink.
+  * All symbols not in COMMON-LISP (as per ANSI CL) are referenced with
+    the package prefix, like this: `lisp:space'.
+  * Platform dependencies are emphasized like this:
+       <dl>
+        <dt><em>Platform dependent: <strong>UNIX</strong>,
+            <strong>DOS</strong>, <strong>OS/2</strong>,
+            <strong>Win32</strong>, <strong>Amiga</strong>,
+            <strong>Acorn</strong> platforms only.</em>
+         <dd>...
+       </dl>
+  * Multi-line code snippets with <sub> and <sup> are passed through
+      sed -e 's, ,\&nbsp;,g' -e 's,^,<code>,' -e 's,$,</code><br>,'
+    The reverse filter is
+      sed -e 's,\&nbsp;, ,g' -e 's,^<code>,,' -e 's,</code><br>$,,'
+    You cannot use <pre> because <sub> and <sup> are not valid HTML inside
+    <pre> (the rationale being that <pre> ensures fixed spacing, which is
+    disturbed by <sub>'s smaller font).
+  * Multi-line code snippets without <sub> and <sup> can be written either
+    as above, or as
+          <pre>
+          <code> .....
+          ........
+          </code></pre>
+    Other combinations do not work:
+    - <code><pre>...</pre></code> is not valid HTML, according to the DTD.
+    - <pre><code>...</code></pre>
+      leaves a blank line in Netscape but not in Lynx.
+    - <pre><code>
+      ....</code></pre>
+      leaves two blank lines in Netscape and one blank line in Lynx.
+    - <pre>
+      <code>....</code></pre>
+      leaves one blank line in both Netscape and Lynx.
+  * Do not put a <p> before <table ...>. It causes an extraneous blank line
+    in Netscape Navigator and Amaya.
+  * Do not put a <p> before <dl>, <ol>, <pre>. It causes an extraneous blank
+    line in Amaya.
+  * In Emacs, M-x compile RET in this file runs `weblint'
+    (http://www.cre.canon.co.uk/~neilb/weblint).
+    Please make sure that there are no errors.
+-->
+
+<body>
+<h1 align=center>Implementation Notes for CLISP</h1>
+
+<center>
+<strong>Last modified: 2000-01-14</strong><br>
+<img src="clisp.gif" width=48 height=48 alt="[CLISP icon]">
+</center>
+
+<p>This implementation is mostly conforming to the
+<blockquote>
+<cite> ANSI Common Lisp standard X3.226-1994<br>
+       <a href="http://www.x3.org/tc_home/j13sd4.htm">"Information
+       Technology - Programming Language - Common Lisp"</a>
+</cite></blockquote>
+available on-line as the
+<blockquote>
+<cite> Common Lisp HyperSpec<br>
+       <a href="http://www.harlequin.com/education/books/HyperSpec/FrontMatter/index.html">http://www.harlequin.com/education/books/HyperSpec/</a><br>
+       ("CLHS" for short)
+</cite></blockquote>
+(but the printed ANSI document remains the authoritative source of
+information).
+
+<p>ANSI CL supersedes the earlier specifications
+<blockquote>
+<cite> Guy L. Steele Jr.: Common Lisp - The Language (2nd ed.).<br>
+       Digital Press 1990, 1032 pages.<br>
+       ("CLtL2" for short)
+</cite>
+       <a href="http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html">available on-line</a>
+</blockquote>
+and
+<blockquote>
+<cite> Guy L. Steele Jr.: Common Lisp - The Language (1st ed.).<br>
+       Digital Press 1984, 465 pages.<br>
+       ("CLtL1" for short)
+</cite></blockquote>
+
+<p>These notes document the differences between the CLISP implementation
+of Common Lisp and the ANSI CL standard, and some implementation
+details. This document is indexed in parallel to CLHS.
+
+
+<h2>Chapter Index</h2>
+
+<ol>
+ <li><a href="#intro"><strong>Introduction</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-1.html">[CLHS-1]</a>
+ <li><a href="#syntax"><strong>Syntax</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-2.html">[CLHS-2]</a>
+ <li><a href="#eval"><strong>Evaluation and Compilation</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-3.html">[CLHS-3]</a>
+ <li><a href="#types"><strong>Types and Classes</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-4.html">[CLHS-4]</a>
+ <li><a href="#data"><strong>Data and Control Flow</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-5.html">[CLHS-5]</a>
+ <li><a href="#iteration"><strong>Iteration</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-6.html">[CLHS-6]</a>
+ <li><a href="#objects"><strong>Objects</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-7.html">[CLHS-7]</a>
+ <li><a href="#structures"><strong>Structures</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-8.html">[CLHS-8]</a>
+ <li><a href="#conditions"><strong>Conditions</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-9.html">[CLHS-9]</a>
+ <li><a href="#symbols"><strong>Symbols</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-10.html">[CLHS-10]</a>
+ <li><a href="#packages"><strong>Packages</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-11.html">[CLHS-11]</a>
+ <li><a href="#numbers"><strong>Numbers</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-12.html">[CLHS-12]</a>
+ <li><a href="#characters"><strong>Characters</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-13.html">[CLHS-13]</a>
+ <li><a href="#conses"><strong>Conses</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-14.html">[CLHS-14]</a>
+ <li><a href="#arrays"><strong>Arrays</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-15.html">[CLHS-15]</a>
+ <li><a href="#strings"><strong>Strings</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-16.html">[CLHS-16]</a>
+ <li><a href="#sequences"><strong>Sequences</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-17.html">[CLHS-17]</a>
+ <li><a href="#hash"><strong>Hash Tables</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-18.html">[CLHS-18]</a>
+ <li><a href="#filenames"><strong>Filenames</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-19.html">[CLHS-19]</a>
+ <li><a href="#files"><strong>Files</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-20.html">[CLHS-20]</a>
+ <li><a href="#streams"><strong>Streams</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-21.html">[CLHS-21]</a>
+ <li><a href="#printer"><strong>Printer</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-22.html">[CLHS-22]</a>
+ <li><a href="#reader"><strong>Reader</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-23.html">[CLHS-23]</a>
+ <li><a href="#system"><strong>System Construction</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-24.html">[CLHS-24]</a>
+ <li><a href="#environment"><strong>Environment</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-25.html">[CLHS-25]</a>
+ <li><a href="#glossary"><strong>Glossary</strong></a>
+  <a rel=child href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-26.html">[CLHS-26]</a>
+</ol>
+
+<ul>
+ <li><a href="#appendix"><strong>Appendix</strong></a>
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-a.html">[CLHS-a]</a>
+ <li><a href="#issues"><strong>X3J13 Issue Index</strong></a>
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/Issues-Categorized.html">[CLHS-ic]</a>
+</ul>
+
+<h1><a href="#extensions">Extensions</a></h1>
+
+<ol>
+ <li><a href="#extensions"><strong>Platform-independent Extensions</strong></a>
+  <ol>
+   <li><a href="#image">Saving an Image</a>
+   <li><a href="#quit">Quitting Lisp</a>
+   <li><a href="#language">The Language</a>
+   <li><a href="#encoding">Encodings</a>
+   <li><a href="#gstream">Defining new kinds of Streams</a>
+   <li><a href="#weak">Weak Pointers</a>
+   <li><a href="#final">Finalization</a>
+   <li><a href="#prompt">The Prompt</a>
+   <li><a href="#ansi">Maximum ANSI CL compliance</a>
+   <li><a href="#macros3">Additional Fancy Macros</a>
+  </ol>
+ <li><a href="#platform"><strong>Platform-specific Extensions</strong></a>
+  <ol>
+   <li><a href="#screen">Random Screen Access</a>
+   <li><a href="#modules">External Modules</a>
+   <li><a href="#dffi">The Foreign Function Call Facility</a>
+   <li><a href="#affi">The Amiga Foreign Function Call Facility</a>
+   <li><a href="#rexx">ARexx</a>
+   <li><a href="#socket">Socket Streams</a>
+   <li><a href="#syscalls">System Calls</a>
+   <li><a href="#quickstart">Quickstarting CLISP programs</a>
+   <li><a href="#app-dev">Application delivery with CLISP</a>
+   <li><a href="#shell">Shell Access</a>
+   <li><a href="#other">Other</a>
+  </ol>
+</ol>
+
+<h2><a name="intro"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-1.html">
+    Chapter 1: Introduction</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_1-4-1-3.html">
+    1.4.1.3 Special Symbols</a></h3>
+
+<p>The final delimiter of an interactive stream: On Unix, the user has
+to type Ctrl-D at the beginning of a line. On DOS or Win32, the user has
+to type Ctrl-Z, followed by Return. This final delimiter is never
+actually seen by programs; no need to test for #\^D or #\^Z - use
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char-no-hang.html">
+<code>read-char-no-hang</code></a> to check for end of stream. Calling
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_clear-input.html">
+<code>clear-input</code></a> on the stream removes the end-of-stream
+state, thus making it available for further input.
+
+<p>A newline character can be entered by the user by pressing the
+<em>Newline</em> key or, in the numeric keypad, the <em>Enter</em> key.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_1-4-2.html">
+    1.4.2 Error Terminology</a></h3>
+
+<p>Safety settings are ignored; therefore where the standard uses the
+   phrase ``should signal an error'', an error is signaled.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_1-4-4-5.html">
+    1.4.4.5 Class Precedence Lists</a></h3>
+
+The class precedence lists of the system classes
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_class.html">
+<code>class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_built-in-class.html">
+<code>built-in-class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_structure-class.html">
+<code>structure-class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standard-class.html">
+<code>standard-class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standard-method.html">
+<code>standard-method</code></a> contain the class
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/cla_structure-object.html">
+<code>structure-object</code></a> instead of the class
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/cla_standard-object.html">
+<code>standard-object</code></a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_1-9.html">
+    1.9 Symbols in the COMMON-LISP Package</a></h3>
+
+<p>Symbols missing from the <code>COMMON-LISP</code> package:
+
+<ul>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-linesst.html">
+     <code>*print-lines*</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-miser-widthst.html">
+     <code>*print-miser-width*</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-p_t-dispatchst.html">
+     <code>*print-pprint-dispatch*</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/locmac_call-m__make-method.html">
+     <code>call-method</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_change-class.html">
+     <code>change-class</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_doc_umentationcp.html">
+     <code>compiler-macro</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_compiler-_cro-function.html">
+     <code>compiler-macro-function</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_copy-pprint-dispatch.html">
+     <code>copy-pprint-dispatch</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-compiler-macro.html">
+     <code>define-compiler-macro</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-me_-combination.html">
+     <code>define-method-combination</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_ensure-ge_ric-function.html">
+     <code>ensure-generic-function</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_invalid-method-error.html">
+     <code>invalid-method-error</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_mak_ces-obsolete.html">
+     <code>make-instances-obsolete</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_make-load-form.html">
+     <code>make-load-form</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-load_saving-slots.html">
+     <code>make-load-form-saving-slots</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/locmac_call-m__make-method.html">
+     <code>make-method</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_method-combination.html">
+     <code>method-combination</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_method-co_nation-error.html">
+     <code>method-combination-error</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-dispatch.html">
+     <code>pprint-dispatch</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/locmac_pprint_st-exhausted.html">
+     <code>pprint-exit-if-list-exhausted</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-fi_rint-tabular.html">
+     <code>pprint-fill</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-indent.html">
+     <code>pprint-indent</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-fi_rint-tabular.html">
+     <code>pprint-linear</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_pprint-logical-block.html">
+     <code>pprint-logical-block</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-newline.html">
+     <code>pprint-newline</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/locmac_pprint-pop.html">
+     <code>pprint-pop</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-tab.html">
+     <code>pprint-tab</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pprint-fi_rint-tabular.html">
+     <code>pprint-tabular</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_set-pprint-dispatch.html">
+     <code>set-pprint-dispatch</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_simple-co_at-arguments.html">
+     <code>simple-condition-format-control</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_style-warning.html">
+     <code>style-warning</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_unbound-slot.html">
+     <code>unbound-slot</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_unbound-slot-instance.html">
+     <code>unbound-slot-instance</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_upd_ferent-class.html">
+     <code>update-instance-for-different-class</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_upd_efined-class.html">
+     <code>update-instance-for-redefined-class</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_upgraded-_ex-part-type.html">
+     <code>upgraded-complex-part-type</code></a>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_with-compilation-unit.html">
+     <code>with-compilation-unit</code></a>
+</ul>
+
+<h2><a name="syntax"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-2.html">
+    Chapter 2: Syntax</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_2-3-4.html">
+    2.3.4 Symbols as Tokens</a></h3>
+
+<p>A "reserved token", i.e., a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_t.html#token">
+token</a> that has potential number syntax but cannot be interpreted
+as a number, is interpreted as symbol when being read.
+
+<p>When creating a symbol from a token, no character attributes are removed.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_2-3-5.html">
+    2.3.5 Valid Patterns for Tokens</a></h3>
+
+<p>When a token with package markers is read, then no checking is done
+whether the package part and the symbol-name part do not have number
+syntax. (What's the purpose of this check?) So we consider tokens like
+<code>USER::</code> or <code>:1</code> or <code>LISP::4711</code> or
+<code>21:3</code> as symbols.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_2-4-5.html">
+    2.4.5 Double-Quote</a></h3>
+
+<p>When a string is read, no character attributes are removed.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_2-4-6.html">
+    2.4.6 Backquote</a></h3>
+
+<p>The backquote read macro also works when nested. Example:
+<pre>
+   <code>(eval ``(,#'(lambda () ',a) ,#'(lambda () ',b)))</code>
+ = <code>(eval `(list #'(lambda () ',a) #'(lambda () ',b)))</code>
+ = <code>(eval (list 'list (list 'function (list 'lambda nil (list 'quote a)))
+                     (list 'function (list 'lambda nil (list 'quote b)))
+   )     )</code>
+</pre>
+
+<p>Multiple backquote combinations like <code>,,@</code> or
+<code>,@,@</code> are not implemented. Their use would be confusing
+anyway.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_2-4-8.html">
+    2.4.8 Sharpsign</a></h3>
+
+Reader macros are also defined for the following:
+<table border=1>
+  <tr><td><code>#,</code> <td>load-time evaluation
+  <tr><td><code>#Y</code> <td>function objects and file encoding
+  <tr><td><code>#&#34;</code> <td>pathname
+</table>
+
+<h2><a name="eval"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-3.html">
+    Chapter 3: Evaluation and Compilation</a></h2>
+
+<p>All the functions built by <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_function.html">
+<code>function</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile.html">
+<code>compile</code></a> and the like are atoms. There are built-in
+functions written in C, compiled functions (both of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_compiled-function.html">
+<code>compiled-function</code></a>) and interpreted functions (of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_function.html"><code>function</code></a>).
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-1-1.html">
+    3.1.1 Introduction to Environments</a></h3>
+
+<h4>lisp:the-environment</h4>
+
+<p>As in Scheme, the macro <code>(<strong>lisp:the-environment</strong>)</code>
+returns the current lexical environment. This works only in interpreted code
+and is not compilable!
+
+<h4>lisp:eval-env</h4>
+
+<p><code>(<strong>lisp:eval-env</strong> <var>form</var>
+          &amp;optional <var>env</var>)</code>
+evaluates a form in a given lexical environment, just if the form had
+been part of the program text that environment came from.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-2-1.html">
+    3.2.1 Compiler Terminology</a></h3>
+
+<p>CLISP compiles to platform-independent byte-code.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-2-4-2-2.html">
+    3.2.4.2.2 Definition of Similarity</a></h3>
+
+<p>Hash tables are <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_e.html#externalizable_object">externalizable
+object</a>s.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-3.html">
+    3.3 Declarations</a></h3>
+
+<p>The declarations <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_type.html">type</a>
+<var>type</var> <var>var</var> ...)</code>, <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_ftype.html">ftype</a> <var>type</var> <var>fun</var>
+...)</code>, <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_function.html">function</a> <var>name</var>
+<var>arglist</var> <var>result-type</var>)</code>, <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_optimize.html">optimize</a> (<var>quality</var>
+<var>value</var>) ...)</code> are ignored by the interpreter and the
+compiler.
+
+<p>The ANSI CL declaration
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_optimize.html">optimize</a>
+(debug ...))</code> is legal.
+
+<p>Additional declarations:
+<ul>
+<li>
+  The ANSI CL declaration
+  <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_ignorecm_ignorable.html">ignorable</a>
+  <var>var</var> ...)</code> affects the variable binding
+  for the variable <var>var</var>. The compiler will not warn about the
+  variable, regardless whether it is used or not.
+<li>
+  The declaration <code>(compile)</code> has the effect that the current
+  form is compiled prior to execution.
+  Examples:
+  <p>
+  <code>(locally (declare (compile)) <var>form</var>)</code>
+  executes a compiled version of form.
+  <p>
+  <pre><code>(let ((x 0))
+  (flet ((inc () (declare (compile)) (incf x))
+         (dec () (decf x)))
+    (values #'inc #'dec)
+) )
+</code></pre>
+  returns two functions. The first is compiled and increments
+  <code>x</code>, the second is interpreted (slower) and decrements the
+  same <code>x</code>.
+</ul>
+
+<p>The type assertion <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_the.html">the</a>
+<var>value-type</var> <var>form</var>)</code> enforces a type check in
+interpreted code. No type check is done in compiled code.
+
+<p>See also the <a href="#ethe"><code>lisp:ethe</code></a> macro.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-6.html">
+    3.4.6 Boa Lambda Lists</a></h3>
+
+<p>The initial value of an <code>&amp;aux</code> variable in a boa lambda
+list is the value of the corresponding slot's initial form.
+
+<h2><a name="types"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-4.html">
+    Chapter 4: Types and Classes</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-2-3.html">
+    4.2.3 Type Specifiers.</a></h3>
+
+<p>The general form of the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_complex.html.html">
+<code>complex</code></a> type specifier is
+<code>(complex <var>type-of-real-part</var>
+<var>type-of-imaginary-part</var>)</code>.  The type specifier
+<code>(complex <var>type</var>)</code> is equivalent to <code>(complex
+<var>type</var> <var>type</var>)</code>.
+
+<p>The ANSI CL type specifier
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_real.html">real</a>
+       <var>low</var> <var>high</var>)</code>
+denotes the real numbers between <var>low</var> and <var>high</var>.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_deftype.html">
+<code>deftype</code></a> lambda lists are subject to destructuring
+(nested lambda lists are allowed, as in
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defmacro.html">
+<code>defmacro</code></a>) and may
+contain a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-4.html">
+<code>&amp;whole</code></a> marker, but not an
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-4.html">
+<code>&amp;environment</code></a> marker.
+
+<p><code>(<strong>lisp:type-expand-1</strong>
+<var>typespec</var>)</code>: If <var>typespec</var> is a user-defined
+type, <code>type-expand-1</code> will expand it once and return two
+values: the expansion and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a>. If <var>typespec</var> is not
+a user-defined type, then the two values <var>typespec</var> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> are returned.
+
+<p><code>(<strong>lisp:type-expand</strong> <var>typespec</var>)</code>:
+This is similar to <code>(type-expand-1 <var>typespec</var>)</code>, but
+repeatedly expands <var>typespec</var> until it is no longer a
+user-defined type. A second value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> is returned as for <code>type-expand-1</code>,
+indicating whether the original <var>typespec</var> was a user-defined
+type.
+
+<p>The possible results of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_type-of.html">
+<code>type-of</code></a> are:
+
+<ul>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_cons.html">
+      <code>cons</code></a>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_symbol.html">
+      <code>symbol</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_null.html">
+      <code>null</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_boolean.html">
+      <code>boolean</code></a>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_fixnum.html">
+      <code>fixnum</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_bignum.html">
+      <code>bignum</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_ratio.html">
+      <code>ratio</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+      <code>short-float</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+      <code>single-float</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+      <code>double-float</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+      <code>long-float</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_complex.html">
+      <code>complex</code></a>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html_character.html">
+      <code>character</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_base-char.html">
+      <code>base-char</code></a>
+  <li><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_array.html">array</a>
+             <var>element-type</var> <var>dimensions</var>)</code>,
+      <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-array.html">simple-array</a>
+             <var>element-type</var> <var>dimensions</var>)</code>
+  <li><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html">vector</a>
+             t <var>size</var>)</code>,
+      <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-vector.html">simple-vector</a>
+             <var>size</var>)</code>
+  <li><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">string</a>
+             <var>size</var>)</code>,
+      <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">simple-string</a>
+             <var>size</var>)</code>
+  <li><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_base-string.html">base-string</a>
+             <var>size</var>)</code>, <code>
+      (<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-base-string.html">simple-base-string</a>
+       <var>size</var>)</code>
+  <li><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_bit-vector.html">bit-vector</a>
+             <var>size</var>)</code>, <code>
+      (<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-bit-vector.html">simple-bit-vector</a>
+       <var>size</var>)</code>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_function.html">
+      <code>function</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_compiled-function.html">
+      <code>compiled-function</code></a>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_stream.html">
+      <code>stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_file-stream.html">
+      <code>file-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_synonym-stream.html">
+      <code>synonym-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_broadcast-stream.html">
+      <code>broadcast-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_concatenated-stream.html">
+      <code>concatenated-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_two-way-stream.html">
+      <code>two-way-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_echo-stream.html">
+      <code>echo-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string-stream.html">
+      <code>string-stream</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_package.html">
+      <code>package</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_hash-table.html">
+      <code>hash-table</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_readtable.html">
+      <code>readtable</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_pathname.html">
+      <code>pathname</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_logical-pathname.html">
+      <code>logical-pathname</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_random-state.html">
+      <code>random-state</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_bytecm_by_yte-position.html">
+      <code>byte</code></a>
+  <li><code>special-operator</code>, <code>load-time-eval</code>,
+      <code>symbol-macro</code>,
+      <a href="#encoding"><code>encoding</code></a>,
+      <code>foreign-pointer</code>, <code>foreign-address</code>,
+      <code>foreign-variable</code>, <code>foreign-function</code>
+  <li><a href="#weak"><code>weak-pointer</code></a>,
+      <a href="#reader"><code>read-label</code></a>,
+      <a href="#reader"><code>frame-pointer</code></a>,
+      <code>system-internal</code>
+  <li><code>address</code> (should not occur)
+  <li>any other symbol (structure types or CLOS classes)
+  <li>a class (CLOS classes without proper name)
+</ul>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3.html">
+    4.3 Classes</a></h3>
+
+<p>The CLOS symbols are exported from the package <code>"CLOS"</code>
+and thus normally visible in all user packages. If you do not want them
+(for example, if you want to use the
+<a href="ftp://clisp.cons.org/pub/lisp/clisp/packages/pcl.sept92f.clisp.tar.gz">PCL</a>
+implementation of CLOS instead of the native one), do <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_unuse-package.html">unuse-package</a>
+"CLOS")</code>.
+
+<h4>Deviations from ANSI CL:</h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defclass.html">
+<code>defclass</code></a>: It <em>is</em> required that the superclasses
+of a class be defined before the <code>defclass</code> form for the
+class is evaluated.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defclass.html">
+<code>defclass</code></a> supports the option <code>:metaclass
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_structure-class.html">
+structure-class</a></code>. This option is necessary in order to define a
+subclass of a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defstruct.html">
+<code>defstruct</code></a>-defined structure type using
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defclass.html">
+<code>defclass</code></a> instead of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defstruct.html">
+<code>defstruct</code></a>.
+
+<p>When <a href="http://www.harlequin.com/education/books/HyperSpec/Body/locfun_call-next-method.html">
+<code>call-next-method</code></a> is called with arguments, the rule
+that the ordered set of applicable methods must be the same as for the
+original arguments is enforced by the implementation only in interpreted
+code.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/locfun_call-next-method.html">
+<code>call-next-method</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/locfun_next-method-p.html">
+<code>next-method-p</code></a> are
+local macros, not local functions.  Use <code>#'(lambda ()
+(call-next-method))</code> instead of <code>#'call-next-method</code> if
+you really need it as a function.
+
+<p>There is a generic function
+<code><strong>clos:no-primary-method</strong></code> (similar to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_no-_cable-method.html">
+<code>no-applicable-method</code></a>) which is called when a generic
+function of the class <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standa_ric-function.html">
+<code>standard-generic-function</code></a> is invoked
+and no primary method on that generic function is applicable.
+
+<p><code>clos:generic-flet</code> and <code>clos:generic-labels</code>
+are implemented as macros, not as special operators.  They are not
+imported into the packages <a
+href="#clupack"><code>COMMON-LISP-USER</code></a> and
+<code>COMMON-LISP</code> because of the ANSI CL issue <a
+href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss181.html">GENERIC-FLET-POORLY-DESIGNED:DELETE</a>.
+
+<p>The function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_ensure-ge_ric-function.html">
+<code>ensure-generic-function</code></a> is not implemented.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_add-method.html">
+<code>add-method</code></a> can put methods into other generic functions
+than the one the method came from.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_print-object.html">
+<code>print-object</code></a> is only called on objects of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/cla_standard-object.html">
+<code>standard-object</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/cla_structure-object.html">
+<code>structure-object</code></a>.  It is not called on other objects,
+like conses and numbers, due to the performance concerns.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_doc_umentationcp.html">
+<code>documentation</code></a> still has the CLtL1 implementation.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3-1-1.html">
+    4.3.1.1 Standard Metaclasses</a></h3>
+
+<p>Among those classes listed in
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3-7.html#classtypecorrespondence">
+Figure 4-8</a>, only the following are instances of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_built-in-class.html">
+<code>built-in-class</code></a>:
+<ul>
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_t.html"><code>t</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html"><code>character</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_number.html"><code>number</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_complex.html"><code>complex</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_real.html"><code>real</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_float.html"><code>float</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_rational.html"><code>rational</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_ratio.html"><code>ratio</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_sequence.html"><code>sequence</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_array.html"><code>array</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html"><code>vector</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_bit-vector.html">
+         <code>bit-vector</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html"><code>string</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_list.html"><code>list</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_cons.html"><code>cons</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_symbol.html"><code>symbol</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_null.html"><code>null</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_function.html"><code>function</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_generic-function.html">
+         <code>generic-function</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standa_ric-function.html">
+         <code>standard-generic-function</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_hash-table.html">
+         <code>hash-table</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_package.html"><code>package</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_pathname.html"><code>pathname</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_logical-pathname.html">
+         <code>logical-pathname</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_random-state.html">
+         <code>random-state</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_readtable.html"><code>readtable</code></a>,
+  <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_stream.html"><code>stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_synonym-stream.html">
+         <code>synonym-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_broadcast-stream.html">
+         <code>broadcast-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_concatenated-stream.html">
+         <code>concatenated-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_two-way-stream.html">
+         <code>two-way-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_echo-stream.html">
+         <code>echo-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string-stream.html">
+         <code>string-stream</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_file-stream.html">
+         <code>file-stream</code></a>.
+</ul>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3-2.html">
+    4.3.2 Defining Classes</a></h3>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defclass.html"><code>defclass</code></a>
+supports the <code>:metaclass</code> option.  Possible values are
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standard-class.html">
+<code>standard-class</code></a> (the default) and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_structure-class.html">
+<code>structure-class</code></a> (which creates structure classes, like
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defstruct.html"><code>defstruct</code></a> does).
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3-6.html">
+    4.3.6 Redefining Classes</a></h3>
+
+<p>Redefining classes is not supported.  The function
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_upd_efined-class.html">
+<code>update-instance-for-redefined-class</code></a> is not
+implemented.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_4-3-7.html">
+    4.3.7 Integrating Types and Classes</a></h3>
+
+<p>The class <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_method-combination.html">
+<code>method-combination</code></a> is not implemented.
+
+<h2><a name="data"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-5.html">
+    Chapter 5: Data and Control Flow</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_data__w_dictionary.html">
+    5.3. The Data and Control Flow Dictionary</a></h3>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_prog1cm_prog2.html">
+<code>prog1</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_prog1cm_prog2.html">
+<code>prog2</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_and.html">
+<code>and</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_or.html">
+<code>or</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_psetq.html">
+<code>psetq</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_whencm_unless.html">
+<code>when</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_whencm_unless.html">
+<code>unless</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_cond.html">
+<code>cond</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_casecm_ccasecm_ecase.html">
+<code>case</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_multiple-value-list.html">
+<code>multiple-value-list</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_multiple-value-bind.html">
+<code>multiple-value-bind</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_multiple-value-setq.html">
+<code>multiple-value-setq</code></a> are implemented as special operators
+and, as such, rather efficient.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_destructuring-bind.html">
+    destructuring-bind</a></h4>
+
+<p>The ANSI CL macro <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_destructuring-bind.html">
+<code>destructuring-bind</code></a> does not perform full error checking.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compiled-function-p.html">
+    compiled-function-p</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compiled-function-p.html">
+<code>compiled-function-p</code></a> returns <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a> on built-in
+functions written in C, compiled functions and special operator
+handlers. Therefore <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_compiled-function.html">
+<code>compiled-function</code></a> is not a subtype of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_function.html">
+<code>function</code></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+    eq</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+<code>eq</code></a> compares characters and fixnums as
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eql.html">
+<code>eql</code></a> does.  No unnecessary copies are made of characters
+and numbers.  Nevertheless, one should use
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eql.html">
+<code>eql</code></a> as it is more portable across CL implementations.
+
+<p><code>(let ((x y)) (eq x x))</code> always returns <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>, regardless of
+<code>y</code>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_symbol-function.html">
+    symbol-function</a></h4>
+
+<p><code>(setf (<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_symbol-function.html">symbol-function</a>
+<var>symbol</var>) <var>object</var>)</code> requires <var>object</var>
+to be either a function, a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_symbol-function.html">
+<code>symbol-function</code></a> return value or a <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_l.html#lambda_expression">
+lambda expression</a>.  A <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_l.html#lambda_expression">
+lambda expression</a> is thereby immediately converted to a function.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_setfcm_psetf.html">
+    setf</a></h4>
+
+<p>Additional places:
+<dl>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_funcall.html">
+  <code>funcall</code></a>:
+  <dd>
+   <code>(setf (funcall #'<var>symbol</var> ...) <var>object</var>)</code> and
+   <code>(setf (funcall '<var>symbol</var> ...) <var>object</var>)</code>
+   are equivalent to
+   <code>(setf (<var>symbol</var> ...) <var>object</var>)</code>.
+
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_set-dispa_ro-character.html">
+  <code>get-dispatch-macro-character</code></a>:
+  <dd>
+   <code>(setf (get-dispatch-macro-character ...) ...)</code>
+   performs a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_set-dispa_ro-character.html">
+   <code>set-dispatch-macro-character</code></a>.
+
+ <dt><a href="#lfd"><code>long-float-digits</code></a>:
+  <dd>
+   <code>(setf (long-float-digits) <var>digits</var>)</code> sets the
+   default mantissa length of long floats to <var>digits</var> bits.
+
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_values-list.html">
+  <code>values-list</code></a>:
+  <dd>
+  <code>(setf (values-list <var>list</var>) <var>form</var>)</code>  is
+  equivalent to
+  <code>(values-list (setf <var>list</var> (multiple-value-list
+  <var>form</var>)))</code>
+</dl>
+
+<p><code>&amp;key</code> markers in
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defsetf.html">
+<code>defsetf</code></a> lambda lists are supported, but the
+corresponding keywords must appear literally in the program text.
+
+<p><code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_get-setf-expansion.html">get-setf-expansion</a>
+<var>form</var> &amp;optional
+<var>env</var>)</code>, <code>(lisp:get-setf-method <var>form</var>
+&amp;optional <var>env</var>)</code>, and
+<code>(lisp:get-setf-method-multiple-value <var>form</var> &amp;optional
+<var>env</var>)</code> receive as optional argument the environment
+necessary for macro expansions.  In
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-setf-expander.html">
+<code>define-setf-expander</code></a> and
+<code>lisp:define-setf-method</code> lambda lists, one can specify
+<code>&amp;environment</code> and a variable, which will be bound to the
+environment. This environment should be passed to all calls of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_get-setf-expansion.html">
+<code>get-setf-expansion</code></a>, <code>lisp:get-setf-method</code>
+and <code>lisp:get-setf-method-multiple-value</code>.  If this is done,
+even local macros will be interpreted as places correctly.
+
+<p>Attempts to modify read-only data will signal an error. Program text
+and quoted constants loaded from files are considered read-only
+data. This check is only performed for strings, not for conses, other kinds
+of arrays, and user-defined data types.
+
+<p>See also the <a href="#letf">lisp:letf</a> and <a
+href="#letf">lisp:letf*</a> macros.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_function.html">
+    function</a></h4>
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_function.html">function</a>
+<var>symbol</var>)</code> returns the local function
+definition established by <code>flet</code> or <code>labels</code>, if
+it exists, otherwise the global function definition.
+
+<p><code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_special-operator-p.html">special-operator-p</a>
+<var>symbol</var>)</code> returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a>.  If it returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a>, then <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_symbol-function.html">symbol-function</a>
+<var>symbol</var>)</code> returns the (useless) special operator
+handler.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-symbol-macro.html">
+    define-symbol-macro</a></h4>
+
+<p>The macro <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-symbol-macro.html">
+<code><strong>define-symbol-macro</strong></code></a>
+establishes symbol macros with global scope (as opposed to symbol macros
+defined with <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_symbol-macrolet.html">
+<code>symbol-macrolet</code></a>, which have local scope):
+<code>(define-symbol-macro <var>symbol</var>
+<var>expansion</var>)</code>.
+
+<p>The function <code><strong>lisp:symbol-macro-expand</strong></code>
+tests for a symbol macro: If <var>symbol</var> is defined as symbol
+macro, <code>(lisp:symbol-macro-expand <var>symbol</var>)</code> returns two
+values, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> and the expansion, else it returns
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+
+<p>Calling <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_boundp.html">
+<code>boundp</code></a> on a symbol defined as symbol macro
+returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+
+<p>Calling <a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_symbol-value.html">
+<code>symbol-value</code></a> on a symbol defined as symbol
+macro returns the value of the expansion. Calling
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_set.html">
+<code>set</code></a> on a symbol defined as symbol macro calls
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_setfcm_psetf.html">
+<code>setf</code></a> on the expansion.
+
+<p>Calling <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_makunbound.html">
+<code>makunbound</code></a> on a symbol defined as symbol macro
+removes the symbol macro definition.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_lambda.html">
+    lambda</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_lambda_ist-keywords.html">
+<code>lambda-list-keywords</code></a> =
+    <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1-2.html">&amp;optional</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1-3.html">&amp;rest</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1-4.html">&amp;key</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1.html">&amp;allow-other-keys</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1-5.html">&amp;aux</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1.html">&amp;body</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1.html">&amp;whole</a>
+           <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1.html">&amp;environment</a>)</code>
+
+<p><table border=1>
+ <tr><th><em>Platform dependent:</em>
+     <th>16-bit CPU <th>32-bit CPU <th>64-bit CPU
+ <tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_call-a_uments-limit.html">
+     <code>call-arguments-limit</code></a>
+     <td>2<sup>16</sup>=65536
+     <td colspan=2 align=center>2<sup>32</sup>=4294967296
+ <tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_multip_values-limit.html">
+     <code>multiple-values-limit</code></a>
+     <td colspan=3 align=center>2<sup>7</sup>=128
+ <tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_lambda_meters-limit.html">
+     <code>lambda-parameters-limit</code></a>
+     <td>2<sup>16</sup>=65536
+     <td colspan=2 align=center>2<sup>32</sup>=4294967296
+</table>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defun.html">
+    defun</a> &amp; <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defmacro.html">
+    defmacro</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defun.html">
+<code>defun</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defmacro.html">
+<code>defmacro</code></a> are allowed in
+non-toplevel positions. As an example, consider the old (CLtL1)
+definition of <code>gensym</code>:
+
+<pre><code>(let ((gensym-prefix "G")
+      (gensym-count 1))
+  (defun gensym (&amp;optional (x nil s))
+    (when s
+      (cond ((stringp x) (setq gensym-prefix x))
+            ((integerp x)
+             (if (minusp x)
+               (error "~S: index ~S is negative" 'gensym x)
+               (setq gensym-count x)
+            ))
+            (t (error "~S: argument ~S of wrong type" 'gensym x))
+    ) )
+    (prog1
+      (make-symbol
+        (concatenate 'string
+          gensym-prefix
+          (write-to-string gensym-count :base 10 :radix nil)
+      ) )
+      (incf gensym-count)
+) ) )
+</code></pre>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_special.html">
+    special</a></h4>
+
+<code>(proclaim '(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/dec_special.html">special</a>
+<var>var</var>))</code> declarations may not be undone. The same holds
+for <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defparametercm_defvar.html">
+<code>defvar</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defparametercm_defvar.html">
+<code>defparameter</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defconstant.html">
+<code>defconstant</code></a> declarations.
+
+<p>It is an error if a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defconstant.html">
+<code>defconstant</code></a> variable is bound at the
+moment the <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defconstant.html">
+<code>defconstant</code></a> is executed, but
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defconstant.html">
+<code>defconstant</code></a> does not check this.
+
+<p>Constants may not be bound dynamically or lexically.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_eval-when.html">
+    eval-when</a></h4>
+
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_eval-when.html">
+<code>eval-when</code></a> also accepts the situations <code>(not
+eval)</code> and <code>(not compile)</code>.
+
+<h2><a name="iteration"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-6.html">
+    Chapter 6: Iteration</a></h2>
+
+<p>No notes.
+
+<h2><a name="objects"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-7.html">
+    Chapter 7: Objects</a></h2>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_7-2.html">Changing
+the class of a given instance</a> is not supported.  The
+functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_change-class.html">
+<code>change-class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_upd_ferent-class.html">
+<code>update-instance-for-different-class</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_mak_ces-obsolete.html">
+<code>make-instances-obsolete</code></a> are not implemented.
+
+<p>Only the <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_7-6-6-2.html">
+<code>standard</code></a> method combination is implemented.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_7-6-6-3.html">User-defined
+method combination</a> is not supported.  The macros
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-me_-combination.html">
+<code>define-method-combination</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/locmac_call-m__make-method.html">
+<code>call-method</code></a> and the functions
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_invalid-method-error.html">
+<code>invalid-method-error</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_method-co_nation-error.html">
+<code>method-combination-error</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_met_d-qualifiers.html">
+<code>method-qualifiers</code></a> are not implemented.
+
+<h2><a name="structures"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-8.html">
+    Chapter 8: Structures</a></h2>
+
+<p>The <code>:print-function</code> option should contain a
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_l.html#lambda_expression">
+lambda expression</a>
+<code>(lambda (structure stream depth) (declare (ignore depth)) ...)</code>
+This <a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_l.html#lambda_expression">
+lambda expression</a> names a function whose task is to output the
+external representation of structure onto the stream. This may be done
+by outputting text onto the stream using
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-char.html">
+<code>write-char</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-str_m_write-line.html">
+<code>write-string</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>write</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>prin1</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>princ</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>print</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>pprint</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a> and the
+like. The following rules must be obeyed:
+
+<ul>
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-escapest.html">
+  <code>*print-escape*</code></a> must be respected.
+
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-prettyst.html">
+  <code>*print-pretty*</code></a> should not and cannot be
+  respected, since the pretty-print mechanism is not accessible from
+  outside.
+
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-circlest.html">
+  <code>*print-circle*</code></a> need not to be
+  respected. This is managed by the system. (But the print-circle
+  mechanism handles only those objects that are (direct or indirect)
+  components of structure.)
+
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-l_int-lengthst.html">
+  <code>*print-level*</code></a> is respected by
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>write</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>prin1</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>princ</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>print</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>pprint</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+  <code>format</code></a> instructions
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-1.html"><code>~A</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-2.html"><code>~S</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-3.html"><code>~W</code></a>,
+  and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+  <code>format</code></a> instructions
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-1.html"><code>~R</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-2.html"><code>~D</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-3.html"><code>~B</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-4.html"><code>~O</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-5.html"><code>~X</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-1.html"><code>~F</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-2.html"><code>~E</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-3.html"><code>~G</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-4.html"><code>~$</code></a>
+  with not-numerical arguments.  Therefore the print-level mechanism
+  works automatically if only these functions are used for outputting
+  objects and if they are not called on objects with nesting level &gt;
+  1. (The print-level mechanism does not recognize how many parentheses
+  you have output. It only counts how many times it was called
+  recursively.)
+
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-l_int-lengthst.html">
+  <code>*print-length*</code></a> must be respected,
+  especially if you are outputting an arbitrary number of components.
+
+ <li>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+  <code>*print-readably*</code></a> must be
+  respected. Remember that the values of
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-escapest.html">
+  <code>*print-escape*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-l_int-lengthst.html">
+  <code>*print-level*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-l_int-lengthst.html">
+  <code>*print-length*</code></a> are ignored
+  if <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+  <code>*print-readably*</code></a> is true.  The value of
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+  <code>*print-readably*</code></a> is respected by
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_print-unr_dable-object.html">
+  <code>print-unreadable-object</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>write</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>prin1</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>princ</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>print</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+  <code>pprint</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+  <code>format</code></a> instructions
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-1.html"><code>~A</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-2.html"><code>~S</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-3.html"><code>~W</code></a>,
+  and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+  <code>format</code></a> instructions
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-1.html"><code>~R</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-2.html"><code>~D</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-3.html"><code>~B</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-4.html"><code>~O</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-5.html"><code>~X</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-1.html"><code>~F</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-2.html"><code>~E</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-3.html"><code>~G</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-4.html"><code>~$</code></a>
+  with not-numerical arguments.  Therefore
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+  <code>*print-readably*</code></a> will be respected
+  automatically if only these functions are used for printing objects.
+
+ <li>You need not worry about the values of
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-b_rint-radixst.html">
+  <code>*print-base*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-b_rint-radixst.html">
+  <code>*print-radix*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-casest.html">
+  <code>*print-case*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-gensymst.html">
+  <code>*print-gensym*</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-arrayst.html">
+  <code>*print-array*</code></a>,
+  <a href="#pr-closure"><code>lisp:*print-closure*</code></a>,
+  <a href="#pr-rpars"><code>lisp:*print-rpars*</code></a>,
+  <a href="#pr-indent"><code>lisp:*print-indent-lists*</code></a>.
+</ul>
+
+<p>The <code>:inherit</code> option is exactly like
+<code>:include</code> except that it does not create
+new accessors for the inherited slots.
+
+
+<h2><a name="conditions"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-9.html">
+    Chapter 9: Conditions</a></h2>
+
+<p>When an error occurred, you are in a break loop. You can evaluate
+forms as usual. The <code>help</code> command (or help key if there is
+one) lists the available <a href="#debugger">debugging commands</a>.
+
+<p>The macro <code>(<strong>lisp:muffle-cerrors</strong>
+{<var>form</var>}*)</code> executes the <var>form</var>s. When a
+continuable error occurs, no message is printed. Instead, the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/res_continue.html">
+<code>continue</code></a> restart is invoked.
+
+<p>The macro <code>(<strong>lisp:appease-cerrors</strong>
+{<var>form</var>}*)</code> executes the <var>form</var>s. When a
+continuable error occurs, the error is printed as a warning and the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/res_continue.html">
+<code>continue</code></a> restart is invoked.
+
+<p>The macro <code>(<strong>lisp:exit-on-error</strong>
+{<var>form</var>}*)</code> executes the <var>form</var>s. When a
+non-continuable error or a Ctrl-C interrupt occurs, the error is printed
+and CLISP terminates with error status.
+
+<p>The macro <code><strong>lisp:with-restarts</strong></code> is like
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">
+<code>restart-case</code></a>, except that the forms are specified after
+the restart clauses instead of before them, and the restarts created are
+not implicitly associated to any condition.
+  <code>(lisp:with-restarts
+  (</code>{<var>restart-clause</var>}*<code>)</code>
+  {<var>form</var>}*<code>)</code>
+is therefore equivalent to <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">restart-case</a>
+(progn </code>{<var>form</var>}*<code>)</code>
+{<var>restart-clause</var>}*<code>)</code>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_9-1-3-1-3.html">
+    9.1.3.1.3 Embedded Newlines in Condition Reports</a></h3>
+
+<p>The error message prefix for the first line is "*** - ". There is no
+prefix for subsequent error lines. The aesthetics of condition reports
+containing an object, which requires newlines when pretty printing is
+enabled, is undefined.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_condi_s_dictionary.html">
+    9.2. The Conditions Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_signal.html">
+    signal</a></h4>
+
+The default condition type for conditions created by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_signal.html">
+<code>signal</code></a>
+is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_simple-condition.html">
+<code>simple-condition</code></a>, not
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_simple-error.html">
+<code>simple-error</code></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">
+    restart-case</a></h4>
+
+<p>In <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">
+<code>restart-case</code></a> clauses the argument list can also
+be specified after the keyword/value pairs instead of before them. The
+syntax therefore is
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">restart-case</a>
+       <var>form</var> {<var>restart-clause</var>}*)</code>
+with
+<table>
+  <tr><td><var>restart-clause</var> ::=
+   <td>  <code>(<var>restart-name</var></code> <var>arglist</var>
+   {<var>keyword value</var>}* {<var>form</var>}*<code>)</code>
+  <tr><td>
+   <td>| <code>(<var>restart-name</var></code> {<var>keyword
+   value</var>}* <var>arglist</var> {<var>form</var>}*<code>)</code>
+</table>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_condi_s_dictionary.html">
+    compute-restarts</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compute-restarts.html">
+<code>compute-restarts</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_find-restart.html">
+<code>find-restart</code></a> behave as specified in ANSI CL: If the
+optional condition argument is non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_nil.html
+convar_nil.html"><code>nil</code></a>, only restarts associated with
+that condition and restarts associated to no condition at all are
+considered.  Therefore the effect of associating a restart to a
+condition is not to activate it, but to hide it from other
+conditions. This makes the syntax dependent implicit association
+performed by <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_restart-case.html">
+<code>restart-case</code></a> nearly obsolete.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_warn.html">
+    warn</a></h4>
+
+<p>The default condition type for conditions created by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_warn.html">
+<code>warn</code></a> is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_simple-warning.html">
+<code>simple-warning</code></a>, not
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_simple-error.html">
+<code>simple-error</code></a>.
+
+
+<h2><a name="symbols"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-10.html">
+    Chapter 10: Symbols</a></h2>
+
+<p>No notes.
+
+<h2><a name="packages"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-11.html">
+    Chapter 11: Packages</a></h2>
+
+<p>The standard ANSI CL packages
+<ul>
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-1.html">
+     <code><strong>COMMON-LISP</strong></code></a> with the nickname
+     <code><strong>CL</strong></code>;
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-2.html">
+     <code><strong>COMMON-LISP-USER</strong></code></a> with the nickname
+     <code><strong>CL-USER</strong></code> and
+ <li><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-3.html">
+     <code><strong>KEYWORD</strong></code></a>
+</ul>
+
+<p>are implemented. The package <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-1.html">
+<code>COMMON-LISP</code></a> exports only
+those symbols from the ANSI CL standard that are actually implemented.
+
+<a name="clupack"></a><h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-2.html">
+    11.1.2.2 The COMMON-LISP-USER Package</a></h3>
+
+The <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-2.html">
+<code>COMMON-LISP-USER</code></a> package uses only the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-1.html">
+<code>COMMON-LISP</code></a> package.
+
+<a name="imppack"></a><h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-4.html">
+    11.1.2.4 Implementation-Defined Packages</a></h3>
+
+The following additional packages exist:
+<ul>
+  <li><code><strong>LISP</strong></code> exports all symbols needed for a
+      CLtL1/CltL2 environment, excluding CLOS.
+  <li><code><strong>CLOS</strong></code> exports all CLOS specific
+      symbols needed for a CLtL1/CltL2 environment.
+  <li><code><strong>USER</strong></code> is the default user's package for a
+      CLtL1/CltL2 environment.
+  <li><code><strong>SYSTEM</strong></code>, with the nicknames
+      <code><strong>SYS</strong></code> and
+      <code><strong>COMPILER</strong></code>, has no exported symbols.
+      It defines many system internals.
+  <li><a href="#encoding"><code><strong>CHARSET</strong></code></a>
+      defines and exports some character sets, for use with
+      <code>make-encoding</code> and as <a
+      href="#extfmt"><code>:external-format</code></a> argument.
+  <li><code><strong>FFI</strong></code> implements the <a
+      href="#dffi">foreign function interface</a>.  Some platforms only.
+  <li><code><strong>SCREEN</strong></code> defines an API for <a
+      href="#screen">random screen access</a>.  Some platforms only.
+</ul>
+
+<p>All pre-existing packages except <a
+href="#imppack"><code>USER</code></a> and <a
+href="#clupack"><code>COMMON-LISP-USER</code></a> belong to the
+implementation, in the sense that doing side-effects on them or on their
+symbols causes undefined behavior.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_packa_s_dictionary.html">
+    11.2. The Packages Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-package.html">
+    <code>make-package</code></a></h4>
+
+<p>For <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-package.html">
+<code>common-lisp:make-package</code></a>, the default value of the
+<code>:use</code> argument is <code>("COMMON-LISP")</code>.
+For <code>lisp:make-package</code>, the default value of the
+<code>:use</code> argument is <code>("LISP" "CLOS")</code>.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-package.html">
+<code>make-package</code></a> and
+<code>lisp:in-package</code> accept a
+keyword argument <code>:case-sensitive</code>.  Similarly,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defpackage.html">
+<code>defpackage</code></a> accepts an option
+<code>:case-sensitive</code>. When its value is non-<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, the package will
+be case sensitive, i.e., the reader will not case-convert symbol names
+before looking them up or creating them in this package. The package
+names are still subject to <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_readtable-case.html">readtable-case</a> <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/var_streadtablest.html">*readtable*</a>)</code>, though.
+
+<h2><a name="numbers"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-12.html">
+    Chapter 12: Numbers</a></h2>
+
+<p>The type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_number.html">
+<code>number</code></a> is the disjoint union of the types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_real.html">
+<code>real</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_complex.html">
+<code>complex</code></a>.  (&#34;<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_e.html#exhaustive_partition">exhaustive
+partition</a>&#34;)
+
+<p>The type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_real.html">
+<code>real</code></a> is the disjoint union of the types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_rational.html">
+<code>rational</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_float.html">
+<code>float</code></a>.
+
+<p>The type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_rational.html">
+<code>rational</code></a> is the disjoint union of the types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html">
+<code>integer</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_ratio.html">
+<code>ratio</code></a>.
+
+<p>The type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html">
+<code>integer</code></a> is the disjoint union of the types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_fixnum.html">
+<code>fixnum</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_bignum.html">
+<code>bignum</code></a>.
+
+<p>The type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_float.html">
+<code>float</code></a> is the disjoint union of the types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+<code>short-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+<code>single-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+<code>double-float</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+<code>long-float</code></a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-1-3-2.html">
+    12.1.1.3.2 Byte Operations on Integers</a></h3>
+
+Byte specifiers are objects of type <code>byte</code>, not integers.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-3-3.html">
+    12.1.3.3 Rule of Float Substitutability</a></h3>
+
+When a mathematical function may return an exact (rational) or
+inexact (floating-point) result, it always returns the exact result.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-4.html">
+    12.1.4 Floating-point Computations</a></h3>
+
+<p>There are <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+four floating point types</a>: short-float, single-float,
+double-float and long-float:
+
+<table border=1>
+  <tr> <th>type           <th>sign    <th>mantissa   <th>exponent  <th>comment
+  <tr> <th>short-float    <td>1 bit   <td align=center>16+1 bits
+       <td align=center>8 bits
+  <tr> <th>single-float   <td>1 bit   <td align=center>23+1 bits
+       <td align=center>8 bits   <td>CLISP uses IEEE format
+  <tr> <th>double-float   <td>1 bit   <td align=center>52+1 bits
+       <td align=center>11 bits  <td>CLISP uses IEEE format
+  <tr> <th>long-float     <td>1 bit   <td align=center>&gt;=64 bits
+       <td align=center>32 bits  <td>variable length
+</table>
+
+<p>The single and double float formats are those of the IEEE standard
+(1981), except that CLISP does not support features like +0, -0, +inf,
+-inf, gradual underflow, NaN, etc. (Common Lisp does not make use of
+these features.)  This is why <a
+href="#features"><code>*features*</code></a> does not contain the
+:IEEE-FLOATING-POINT keyword.
+
+<p>Long floats have variable mantissa length, which is a multiple of 16
+(or 32, depending on the word size of the processor). The default length
+used when long floats are read is given by the place <a
+name="lfd"><code><strong>(lisp:long-float-digits)</strong></code></a>.
+It can be set by <code>(setf (lisp:long-float-digits)
+<var>nnn</var>)</code>, where <var>nnn</var> is a positive integer.
+
+<p>Example: <code>(setf (lisp:long-float-digits) 3322)</code> sets the
+default precision of long floats to 1000 decimal digits.
+
+<a name="flocont"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-4-4.html">
+    12.1.4.4 Rule of Float Precision Contagion</a></h4>
+
+<p>The floating point contagion is controlled by the variable
+<code><strong>lisp:*floating-point-contagion-ansi*</strong></code>.
+When it is non-nil, contagion is done as per the ANSI CL standard:
+short-&gt;single-&gt;double-&gt;long.
+
+<dl><dt>Rationale:
+<dd>See it pragmatically: save what you can and let others worry about
+ the rest.
+<dt>Short:
+<dd>CL knows the number's precision, not accuracy, so preserving
+ the precision can be accomplished reliably, while anything relating to
+ the accuracy is just a speculation - only the user (programmer) knows
+ what it is in each case.
+<dt>Long:
+<dd>A float is an approximation of a real number.  One can think of it
+ as a random variable with the mean equal to itself and standard
+ deviation equal to half the last significant digit.  E.g.,
+ <code>1.5</code> is actually <code>1.5+-0.05</code>.  Consider adding
+ <code>1.5</code> and <code>1.75</code>.  ANSI CL requires that <code>(+
+ 1.5 1.75)</code> return <code>3.25</code>, while traditional CLISP
+ would return <code>3.3</code>.  The implied random variables are:
+ <code>3.25+-0.005</code> and <code>3.3+-0.05</code>.  Note that the
+ CLISP's way <strong>DOES</strong> lie about the mean: the mean
+ <strong>IS</strong> <code>3.25</code> and nothing else, while the ANSI
+ CL's way <strong>COULD</strong> be lying about the deviation
+ (accuracy): if the implied accuracy of <code>1.5 (0.05)</code> is its
+ actual accuracy, then the accuracy of the result cannot be smaller that
+ that.  Therefore, since CL has no way of knowing the actual accuracy,
+ ANSI CL (and all the other standard engineering programming languages,
+ like C, FORTRAN etc) decides that keeping the accuracy correct is the
+ business of the programmer, while the language should preserve what it
+ can - the precision.
+ <dt>Experience:
+<dd> Rounding errors accumulate, and if a computation is conducted with
+ insufficient precision, an outright incorrect result can be returned.
+ (E.g., <code>E(x^2)-E(x)^2</code> can be negative!)  The user should not
+ mix floats of different precision (that's what
+ <code>lisp:*warn-on-floating-point-contagion*</code> is for), but one
+ should not be penalized for this too harshly.
+</dl>
+
+<p>When <code>lisp:*floating-point-contagion-ansi*</code> is nil, the
+traditional CLISP method is used, namely:
+
+<p>The result of an arithmetic operation whose arguments are of
+different float types is rounded to the float format of the shortest
+(least precise) of the arguments:
+    rational -&gt; long float -&gt; double float -&gt; single float
+    -&gt; short float
+(in contrast to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-4-4.html">
+12.1.4.4 Rule of Float Precision Contagion</a>!)
+
+<dl><dt>Rationale:
+<dd> See it mathematically.  Add intervals:
+  {1.0 &plusmn; 1e-8} + {1.0 &plusmn; 1e-16} = {2.0 &plusmn; 1e-8}
+  So, if we add <code>1.0s0</code> and <code>1.0d0</code>, we should get
+  <code>2.0s0</code>.
+<dt>Briefly:
+<dd> Do not suggest accuracy of a result by giving it a precision that
+ is greater than its accuracy.
+<dt>Example:
+<dd> <code>(- (+ 1.7 pi) pi)</code> should not return
+     <code>1.700000726342836417234L0</code>, it should return
+     <code>1.7f0</code> (or <code>1.700001f0</code> if there were
+     rounding errors).
+<dt>Experience:
+<dd> If in a computation using thousands of short floats, a long float
+  (like pi) happens to be used, the long precision should not propagate
+  throughout all the intermediate values. Otherwise, the long result
+  would look precise, but its accuracy is only that of a short float;
+  furthermore much computation time would be lost by calculating with
+  long floats when only short floats would be needed.
+</dl>
+
+<p>If the variable
+<code><strong>lisp:*warn-on-floating-point-contagion*</strong></code> is
+true, a warning is emitted for every coercion involving different
+floating-point types.
+
+<p>When rational numbers are to be converted to
+floats (due to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_float.html">
+<code>float</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_coerce.html">
+<code>coerce</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_sqrtcm_isqrt.html">
+<code>sqrt</code></a> or a transcendental function), the result type is
+given by the variable
+<code><strong>lisp:*default-float-format*</strong></code>.
+
+<h4>lisp:without-floating-point-underflow</h4>
+
+<p>The macro
+  <code><strong>lisp:without-floating-point-underflow</strong></code>:
+  <code>(without-floating-point-underflow {<var>form</var>}*)</code>
+executes the <var>form</var>s, with errors of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_floati_nt-underflow.html">
+<code>floating-point-underflow</code></a> inhibited.  Floating point
+operations will silently return zero instead of signalling an error of
+type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_floati_nt-underflow.html">
+<code>floating-point-underflow</code></a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-5.html">
+    12.1.5 Complex Computations</a></h3>
+
+<p>Complex numbers can have a real part and an imaginary part of different
+types. For example, <code>(sqrt -9.0)</code> evaluates to the number
+<code>#C(0 3.0)</code>, which has a real part of exactly 0, not only 0.0
+(which would mean "approximately 0").
+
+<p>The type specifier for this is <code>(complex integer
+single-float)</code>, and <code>(complex <var>type-of-real-part</var>
+<var>type-of-imaginary-part</var>)</code> in general.
+
+<p>The type specifier <code>(complex <var>type</var>)</code> is
+equivalent to <code>(complex <var>type</var> <var>type</var>)</code>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_12-1-5-3.html">
+    12.1.5.3 Rule of Canonical Representation for Complex Rationals</a></h4>
+
+<p>Complex numbers can have a real part and an imaginary part of
+different types. If the imaginary part is <code>eql</code> to
+<code>0</code>, the number is automatically converted to a real number.
+
+<p>This has the advantage that <code>(let ((x (sqrt -9.0))) (* x
+x))</code> - instead of evaluating to <code>#C(-9.0 0.0)</code>, with
+<code>x</code> = <code>#C(0.0 3.0)</code> - evaluates to <code>#C(-9.0
+0)</code> = <code>-9.0</code>, with <code>x</code> = <code>#C(0
+3.0)</code>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_numbers_dictionary.html">
+    12.2 The Numbers Dictionary</a></h3>
+
+<h4>Functions on integers</h4>
+
+<p><code>(<strong>lisp:!</strong> <var>n</var>)</code> returns the factorial
+of <var>n</var>, <var>n</var> a nonnegative integer.
+
+<p><code>(<strong>lisp:exquo</strong> <var>x</var> <var>y</var>)</code>
+returns the quotient <var>x/y</var> of two integers <var>x</var>,<var>y</var>,
+and checks that it is an integer. (This is more efficient than
+<code>/</code>.)
+
+<p><code>(<strong>lisp:xgcd</strong> <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>)</code> returns the values <var>g</var>,
+<var>c<sub>1</sub></var>, ..., <var>c<sub>n</sub></var>, where
+<var>g</var> is the greatest common divisor of the integers
+<var>x<sub>1</sub></var>,...,<var>x<sub>n</sub></var>, and
+<var>c<sub>1</sub></var>,...,<var>c<sub>n</sub></var> are integer
+coefficients such that
+<br><center>
+<code><var>g</var></code> = <code>(gcd <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>)</code> = <code>(+ (*
+<var>c<sub>1</sub></var> <var>x<sub>1</sub></var>) ... (*
+<var>c<sub>n</sub></var> <var>x<sub>n</sub></var>))</code></center>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_expcm_expt.html">
+    expt</a></h4>
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_expcm_expt.html">expt</a>
+          <var>base</var> <var>exponent</var>)</code>
+is not very precise if exponent has large absolute value.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_log.html">
+    log</a></h4>
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_log.html">log</a>
+          <var>number</var> <var>base</var>)</code>
+signals an error if <code><var>base</var> = 1</code>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_pi.html">pi</a></h4>
+
+<p>The value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_pi.html">
+<code>pi</code></a> is a long float with the precision given by <a
+href="#lfd"><code>(lisp:long-float-digits)</code></a>.  When this
+precision is changed, the value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_pi.html">
+<code>pi</code></a> is automatically recomputed.  Therefore <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_pi.html"> <code>pi</code></a> is a variable, not
+a constant.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-fl_decode-float.html">
+    float decoding</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-fl_decode-float.html">
+<code>float-radix</code></a> always returns <code>2</code>.
+
+<p><code>(<a
+ href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-fl_decode-float.html">float-digits</a>
+ <var>number</var> <var>digits</var>)</code>
+coerces <var>number</var> (a real number) to a floating point number
+with at least <var>digits</var> mantissa digits. The following holds:
+<br><center>
+<code>(&gt;=
+(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-fl_decode-float.html">float-digits</a>
+(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-fl_decode-float.html">float-digits</a>
+ <var>number</var> <var>digits</var>)) <var>digits</var>)</code>
+</center>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_boole-_cm_boole-xor.html">
+    boolean operations</a></h4>
+
+<table border=1>
+  <tr><th align=center>constant name          <th align=center>value
+  <tr><th align=left><code>boole-clr</code>   <td align=right> 0
+  <tr><th align=left><code>boole-set</code>   <td align=right>15
+  <tr><th align=left><code>boole-1</code>     <td align=right>10
+  <tr><th align=left><code>boole-2</code>     <td align=right>12
+  <tr><th align=left><code>boole-c1</code>    <td align=right> 5
+  <tr><th align=left><code>boole-c2</code>    <td align=right> 3
+  <tr><th align=left><code>boole-and</code>   <td align=right> 8
+  <tr><th align=left><code>boole-ior</code>   <td align=right>14
+  <tr><th align=left><code>boole-xor</code>   <td align=right> 6
+  <tr><th align=left><code>boole-eqv</code>   <td align=right> 9
+  <tr><th align=left><code>boole-nand</code>  <td align=right> 7
+  <tr><th align=left><code>boole-nor</code>   <td align=right> 1
+  <tr><th align=left><code>boole-andc1</code> <td align=right> 4
+  <tr><th align=left><code>boole-andc2</code> <td align=right> 2
+  <tr><th align=left><code>boole-orc1</code>  <td align=right>13
+  <tr><th align=left><code>boole-orc2</code>  <td align=right>11
+</table>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_ative-fixnum.html">
+    fixnum limits</a></h4>
+
+<table border=1>
+ <tr><th><em>Platform dependent:</em>
+     <th>16-bit CPU <th>32-bit CPU <th>64-bit CPU
+ <tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_ative-fixnum.html">
+         <code>most-positive-fixnum</code></a>
+     <td colspan=2 align=center>2<sup>24</sup>-1 = 16777215
+     <td align=right>2<sup>32</sup>-1 = 4294967295
+ <tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_ative-fixnum.html">
+         <code>most-negative-fixnum</code></a>
+     <td colspan=2 align=center>-2<sup>24</sup> = -16777216
+     <td align=right>-2<sup>32</sup> = -4294967296
+</table>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+    float limits</a></h4>
+
+<p>Together with <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_pi.html">
+<code>pi</code></a>, the other long float constants
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>most-positive-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>least-positive-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>least-negative-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>most-negative-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>least-positive-normalized-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_most-p_d-long-float.html">
+<code>least-negative-normalized-long-float</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_short-_tive-epsilon.html">
+<code>long-float-epsilon</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_short-_tive-epsilon.html">
+<code>long-float-negative-epsilon</code></a> are recomputed whenever <a
+href="#lfd"><code>(lisp:long-float-digits)</code></a> is changed. They
+are variables, not constants.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_floati_id-operation.html">
+    floating-point-invalid-operation</a></h4>
+
+<p>This condition is never signaled by CLISP.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/contyp_floati_oint-inexact.html">
+    floating-point-inexact</a></h4>
+
+<p>This condition is never signaled by CLISP.
+
+<h2><a name="characters"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-13.html">
+    Chapter 13: Characters</a></h2>
+
+<p>The characters are ordered according to a superset of the ASCII
+encoding.
+
+<!-- #ifdef UNICODE -->
+<dl>
+<dt><em>Platform dependent: Only in CLISP built <strong>with</strong>
+    the compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+More precisely, CLISP uses the 16-bit
+<a href="http://www.unicode.org/">Unicode</a> character set (ISO 10646,
+also known as UCS-2).
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(IBMPC_CHS) && !defined(UNICODE) -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>
+    platforms only, and only in CLISP built <strong>without</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+More precisely, CLISP uses the IBM PC character set (code page 437):
+<table border=1>
+  <tr><th><th>#x0 <th>#x1 <th>#x2 <th>#x3 <th>#x4 <th>#x5 <th>#x6 <th>#x7
+          <th>#x8 <th>#x9 <th>#xA <th>#xB <th>#xC <th>#xD <th>#xE <th>#xF
+  <tr><th>#x00 <td>** <td>   <td>   <td>   <td>   <td>   <td>   <td>** <td>**
+               <td>** <td>** <td>** <td>** <td>** <td> &para; <td> &sect;
+  <tr><th>#x10 <td>   <td>   <td>   <td>   <td>   <td>   <td>   <td>
+               <td>   <td>   <td>** <td>** <td>   <td>   <td>   <td>
+  <tr><th>#x20 <td> &nbsp; <td> ! <td> &quot; <td> # <td> $ <td> % <td> &amp;
+               <td> ' <td> ( <td> ) <td> * <td> + <td> , <td> - <td> . <td> /
+  <tr><th>#x30 <td> 0 <td> 1 <td> 2 <td> 3 <td> 4 <td> 5 <td> 6 <td> 7
+               <td> 8 <td> 9 <td> : <td> ; <td> &lt; <td> = <td> &gt; <td> ?
+  <tr><th>#x40 <td> @ <td> A <td> B <td> C <td> D <td> E <td> F <td> G
+               <td> H <td> I <td> J <td> K <td> L <td> M <td> N <td> O
+  <tr><th>#x50 <td> P <td> Q <td> R <td> S <td> T <td> U <td> V <td> W
+               <td> X <td> Y <td> Z <td> [ <td> \ <td> ] <td> ^ <td> _
+  <tr><th>#x60 <td> ` <td> a <td> b <td> c <td> d <td> e <td> f <td> g
+               <td> h <td> i <td> j <td> k <td> l <td> m <td> n <td> o
+  <tr><th>#x70 <td> p <td> q <td> r <td> s <td> t <td> u <td> v <td> w
+               <td> x <td> y <td> z <td> { <td> | <td> } <td> ~ <td>
+  <tr><th>#x80 <td> &Ccedil; <td> &uuml; <td> &eacute; <td> &acirc;
+               <td> &auml; <td> &agrave; <td> &aring; <td> &ccedil;
+               <td> &ecirc; <td> &euml; <td> &egrave; <td> &iuml;
+               <td> &icirc; <td> &igrave; <td> &Auml; <td> &Aring;
+  <tr><th>#x90 <td> &Eacute; <td> &aelig; <td> &AElig; <td> &ocirc;
+               <td> &ouml; <td> &ograve; <td> &ucirc; <td> &ugrave;
+               <td> &yuml; <td> &Ouml; <td> &Uuml; <td> &cent;
+               <td> &pound; <td> &yen; <td> &#8359; <td> &#402;
+  <tr><th>#xA0 <td> &aacute; <td> &iacute; <td> &oacute; <td> &uacute;
+               <td> &ntilde; <td> &Ntilde; <td> &ordf; <td> &ordm;
+               <td> &iquest; <td> &#8976; <td> &not; <td> &frac12;
+               <td> &frac14; <td> &iexcl; <td> &laquo; <td> &raquo;
+  <tr><th>#xB0 <td> &#9617; <td> &#9618; <td> &#9619; <td> &#9474;
+               <td> &#9508; <td> &#9569; <td> &#9570; <td> &#9558;
+               <td> &#9557; <td> &#9571; <td> &#9553; <td> &#9559;
+               <td> &#9565; <td> &#9564; <td> &#9563; <td> &#9488;
+  <tr><th>#xC0 <td> &#9492; <td> &#9524; <td> &#9516; <td> &#9500;
+               <td> &#9472; <td> &#9532; <td> &#9566; <td> &#9567;
+               <td> &#9562; <td> &#9556; <td> &#9577; <td> &#9574;
+               <td> &#9568; <td> &#9552; <td> &#9580; <td> &#9575;
+  <tr><th>#xD0 <td> &#9576; <td> &#9572; <td> &#9573; <td> &#9561;
+               <td> &#9560; <td> &#9554; <td> &#9555; <td> &#9563;
+               <td> &#9562; <td> &#9496; <td> &#9484; <td> &#9608;
+               <td> &#9604; <td> &#9612; <td> &#9616; <td> &#9600;
+  <tr><th>#xE0 <td> &alpha; <td> &szlig; <td> &Gamma; <td> &pi;
+               <td> &Sigma; <td> &sigma; <td> &micro; <td> &tau;
+               <td> &Phi; <td> &Theta; <td> &Omega; <td> &delta;
+               <td> &infin; <td> &phi; <td> &epsilon; <td> &cap;
+  <tr><th>#xF0 <td> &equiv; <td> &plusmn; <td> &ge; <td> &le;
+               <td> &#8992; <td> &#8993; <td> &divide; <td> &asymp;
+               <td> &deg; <td> &#8729; <td> &middot; <td> &radic;
+               <td> &#8319; <td> &sup2; <td> &#9632; <td> &nbsp;
+</table>
+
+<p>Here ** are control characters, not graphic characters. (The
+characters left blank here cannot be represented in this character set).
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(ISOLATIN_CHS) && !defined(UNICODE) -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong> (except NeXTstep),
+    <strong>Win32</strong>, <strong>Amiga</strong>,
+    <strong>Acorn</strong> platforms only, and only in CLISP
+    built <strong>without</strong> compile-time flag
+    <code><strong>UNICODE</strong></code>.</em>
+<dd>More precisely, CLISP uses the ISO Latin-1 (ISO 8859-1) character set:
+<table border=1>
+  <tr><th><th>#x0 <th>#x1 <th>#x2 <th>#x3 <th>#x4 <th>#x5 <th>#x6 <th>#x7
+          <th>#x8 <th>#x9 <th>#xA <th>#xB <th>#xC <th>#xD <th>#xE <th>#xF
+  <tr><th>#x00 <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+               <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+  <tr><th>#x10 <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+               <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+  <tr><th>#x20 <td> &nbsp; <td> ! <td> &#34; <td> # <td> $ <td> % <td> &amp;
+               <td> ' <td> ( <td> ) <td> * <td> + <td> , <td> - <td> . <td> /
+  <tr><th>#x30 <td> 0 <td> 1 <td> 2 <td> 3 <td> 4 <td> 5 <td> 6 <td> 7
+               <td> 8 <td> 9 <td> : <td> ; <td> &lt; <td> = <td> &gt; <td> ?
+  <tr><th>#x40 <td> @ <td> A <td> B <td> C <td> D <td> E <td> F <td> G
+               <td> H <td> I <td> J <td> K <td> L <td> M <td> N <td> O
+  <tr><th>#x50 <td> P <td> Q <td> R <td> S <td> T <td> U <td> V <td> W
+               <td> X <td> Y <td> Z <td> [ <td> \ <td> ] <td> ^ <td> _
+  <tr><th>#x60 <td> ` <td> a <td> b <td> c <td> d <td> e <td> f <td> g
+               <td> h <td> i <td> j <td> k <td> l <td> m <td> n <td> o
+  <tr><th>#x70 <td> p <td> q <td> r <td> s <td> t <td> u <td> v <td> w
+               <td> x <td> y <td> z <td> { <td> | <td> } <td> ~ <td>
+  <tr><th>#x80 <td>   <td>   <td>   <td>   <td>   <td>   <td>   <td>
+               <td>   <td>   <td>   <td>   <td>   <td>   <td>   <td>
+  <tr><th>#x90 <td>   <td>   <td>   <td>   <td>   <td>   <td>   <td>
+               <td>   <td>   <td>   <td>   <td>   <td>   <td>   <td>
+  <tr><th>#xA0 <td> &nbsp; <td> &iexcl; <td> &cent; <td> &pound;
+               <td> &curren; <td> &yen; <td> &brvbar; <td> &sect;
+               <td> &uml; <td> &copy; <td> &ordf; <td> &laquo;
+               <td> &not; <td> &shy; <td> &reg; <td> &macr;
+  <tr><th>#xB0 <td> &deg; <td> &plusmn; <td> &sup2; <td> &sup3;
+               <td> &acute; <td> &micro; <td> &para; <td> &middot;
+               <td> &cedil; <td> &sup1; <td> &ordm; <td> &raquo;
+               <td> &frac14; <td> &frac12; <td> &frac34; <td> &iquest;
+  <tr><th>#xC0 <td> &Agrave; <td> &Aacute; <td> &Acirc; <td> &Atilde;
+               <td> &Auml; <td> &Aring; <td> &AElig; <td> &Ccedil;
+               <td> &Egrave; <td> &Eacute; <td> &Ecirc; <td> &Euml;
+               <td> &Igrave; <td> &Iacute; <td> &Icirc; <td> &Iuml;
+  <tr><th>#xD0 <td> &ETH; <td> &Ntilde; <td> &Ograve; <td> &Oacute;
+               <td> &Ocirc; <td> &Otilde; <td> &Ouml; <td> &times;
+               <td> &Oslash; <td> &Ugrave; <td> &Uacute; <td> &Ucirc;
+               <td> &Uuml; <td> &Yacute; <td> &THORN; <td> &szlig;
+  <tr><th>#xE0 <td> &agrave; <td> &aacute; <td> &acirc; <td> &atilde;
+               <td> &auml; <td> &aring; <td> &aelig; <td> &ccedil;
+               <td> &egrave; <td> &eacute; <td> &ecirc; <td> &euml;
+               <td> &igrave; <td> &iacute; <td> &icirc; <td> &iuml;
+  <tr><th>#xF0 <td> &eth; <td> &ntilde; <td> &ograve; <td> &oacute;
+               <td> &ocirc; <td> &otilde; <td> &ouml; <td> &divide;
+               <td> &oslash; <td> &ugrave; <td> &uacute; <td> &ucirc;
+               <td> &uuml; <td> &yacute; <td> &thorn; <td> &yuml;
+</table>
+Here ** are control characters, not graphic characters. (The characters left
+blank here cannot be represented in this character set).
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(NEXTSTEP_CHS) && !defined(UNICODE) -->
+<dl>
+<dt><em>Platform dependent: <strong>NeXTstep</strong> platforms only,
+    and only in CLISP built <strong>without</strong> compile-time flag
+    <code><strong>UNICODE</strong></code>.</em>
+<dd>More precisely, CLISP uses the NextStep character set:
+<table border=1>
+  <tr><th><th>#x0 <th>#x1 <th>#x2 <th>#x3 <th>#x4 <th>#x5 <th>#x6 <th>#x7
+          <th>#x8 <th>#x9 <th>#xA <th>#xB <th>#xC <th>#xD <th>#xE <th>#xF
+  <tr><th>#x00 <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+               <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+  <tr><th>#x10 <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+               <td>** <td>** <td>** <td>** <td>** <td>** <td>** <td>**
+  <tr><th>#x20 <td> &nbsp; <td> ! <td> &#34; <td> # <td> $ <td> % <td> &amp;
+               <td> ' <td> ( <td> ) <td> * <td> + <td> , <td> - <td> . <td> /
+  <tr><th>#x30 <td> 0 <td> 1 <td> 2 <td> 3 <td> 4 <td> 5 <td> 6 <td> 7
+               <td> 8 <td> 9 <td> : <td> ; <td> &lt; <td> = <td> &gt; <td> ?
+  <tr><th>#x40 <td> @ <td> A <td> B <td> C <td> D <td> E <td> F <td> G
+               <td> H <td> I <td> J <td> K <td> L <td> M <td> N <td> O
+  <tr><th>#x50 <td> P <td> Q <td> R <td> S <td> T <td> U <td> V <td> W
+               <td> X <td> Y <td> Z <td> [ <td> \ <td> ] <td> ^ <td> _
+  <tr><th>#x60 <td> ` <td> a <td> b <td> c <td> d <td> e <td> f <td> g
+               <td> h <td> i <td> j <td> k <td> l <td> m <td> n <td> o
+  <tr><th>#x70 <td> p <td> q <td> r <td> s <td> t <td> u <td> v <td> w
+               <td> x <td> y <td> z <td> { <td> | <td> } <td> ~ <td>
+  <tr><th>#x80 <td> &nbsp; <td> &Agrave; <td> &Aacute; <td> &Acirc;
+               <td> &Atilde; <td> &Auml; <td> &Aring; <td> &Ccedil;
+               <td> &Egrave; <td> &Eacute; <td> &Ecirc; <td> &Euml;
+               <td> &Igrave; <td> &Iacute; <td> &Icirc; <td> &Iuml;
+  <tr><th>#x90 <td> &ETH; <td> &Ntilde; <td> &Ograve; <td> &Oacute;
+               <td> &Ocirc; <td> &Otilde; <td> &Ouml; <td> &Ugrave;
+               <td> &Uacute; <td> &Ucirc; <td> &Uuml; <td> &Yacute;
+               <td> &THORN; <td> &micro; <td> &times; <td> &divide;
+  <tr><th>#xA0 <td> &copy; <td> &iexcl; <td> &cent; <td> &pound;
+               <td> &#8260; <td> &yen; <td> &fnof; <td> &sect;
+               <td> &curren; <td> &#8217; <td> &ldquo; <td> &laquo;
+               <td> &#8249; <td> &#8250; <td> &#64257; <td> &#64258;
+  <tr><th>#xB0 <td> &reg; <td> &ndash; <td> &dagger; <td> &Dagger;
+               <td> &middot; <td> &brvbar; <td> &para; <td> &bull;
+               <td> &#8218; <td> &#8222; <td> &rdquo; <td> &raquo;
+               <td> &hellip; <td> &permil; <td> &not; <td> &iquest;
+  <tr><th>#xC0 <td> &sup1; <td> &#715; <td> &acute; <td> &circ;
+               <td> &tilde; <td> &macr; <td> &#728; <td> &#729;
+               <td> &uml; <td> &sup2; <td> &#730; <td> &cedil;
+               <td> &sup3; <td> &#733; <td> &#731; <td> &#711;
+  <tr><th>#xD0 <td> &mdash; <td> &plusmn; <td> &frac14; <td> &frac12;
+               <td> &frac34; <td> &agrave; <td> &aacute; <td> &acirc;
+               <td> &atilde; <td> &auml; <td> &aring; <td> &ccedil;
+               <td> &egrave; <td> &eacute; <td> &ecirc; <td> &euml;
+  <tr><th>#xE0 <td> &igrave; <td> &AElig; <td> &iacute; <td> &ordf;
+               <td> &icirc; <td> &iuml; <td> &eth; <td> &ntilde;
+               <td> &#321; <td> &Oslash; <td> &OElig; <td> &ordm;
+               <td> &ograve; <td> &oacute; <td> &ocirc; <td> &otilde;
+  <tr><th>#xF0 <td> &ouml; <td> &aelig; <td> &ugrave; <td> &uacute;
+               <td> &ucirc; <td> &#305; <td> &uuml; <td> &yacute;
+               <td> &#322; <td> &oslash; <td> &oelig; <td> &szlig;
+               <td> &thorn; <td> &yuml; <td>  <td>
+</table>
+
+<p>Here ** are control characters, not graphic characters. (The
+characters left blank here cannot be represented in this character set).
+</dl>
+<!-- #endif -->
+
+The following are standard characters:
+<table border=1>
+  <tr><th align=left><code>#\Space</code>              <td> #x20
+  <tr><th align=left><code>#\Newline</code>            <td> #x0A
+</table>
+The following are semi-standard characters:
+<table border=1>
+  <tr><th align=left><code>#\Backspace</code>          <td> #x08
+  <tr><th align=left><code>#\Tab</code>                <td> #x09
+  <tr><th align=left><code>#\Linefeed</code>           <td> #x0A
+  <tr><th align=left><code>#\Page</code>               <td> #x0C
+  <tr><th align=left><code>#\Return</code>             <td> #x0D
+</table>
+<!-- #if defined(MSDOS_CHARNAMES) || defined(WIN32_CHARNAMES) -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd>
+<table border=1>
+  <tr><th align=left><code>#\Rubout</code>             <td> #x08
+</table>
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(UNIX_CHARNAMES) || defined(AMIGA_CHARNAMES) -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>Amiga</strong>, <strong>Acorn</strong> platforms only.</em>
+<dd>
+<table border=1>
+  <tr><th align=left><code>#\Rubout</code>             <td> #x7F
+</table>
+</dl>
+<!-- #endif -->
+
+<p><code>#\Newline</code> is the <a href="#newline">delimiter between
+lines</a>.
+
+<h3>Additional Named Characters</h3>
+
+<p>There are the following additional characters with names:
+
+<table border=1>
+  <tr><th align=left><code>#\Null</code>               <td> #x00
+  <tr><th align=left><code>#\Bell</code>               <td> #x07
+  <tr><th align=left><code>#\Escape</code>             <td> #x1B
+</table>
+
+<p> Additionally, the following syntax is defined for characters with code
+from #x00 to #x1F:
+<table border=1>
+  <tr><th align=left><code>#\^@</code>                      <td> #x00
+  <tr><th align=left><code>#\^A</code> .. <code>#\^Z</code> <td> #x01 .. #x1A
+  <tr><th align=left><code>#\^[</code>                      <td> #x1B
+  <tr><th align=left><code>#\^\</code>                      <td> #x1C
+  <tr><th align=left><code>#\^]</code>                      <td> #x1D
+  <tr><th align=left><code>#\^^</code>                      <td> #x1E
+  <tr><th align=left><code>#\^_</code>                      <td> #x1F
+</table>
+
+<p> See also the section <a HREF="#chario">character i/o</a>.
+
+<h3>Attributes</h3>
+
+<p>Characters do not have the CLtL1 font and bits attributes. For
+backward compatibility, there is a class <code>sys::input-character</code>
+representing either a character with font and bits, or a keystroke.
+The following functions work with objects of types
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+<code>character</code></a>
+and <code>sys::input-character</code>. Note that
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eql.html"><code>eql</code></a> or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_equal.html">
+<code>equal</code></a> can not be used to compare objects of type
+<code>sys::input-character</code>.
+
+<dl>
+ <dt><code>lisp:char-font-limit</code> = 16
+ <dd>The system uses only font 0.
+ <dt><code>lisp:char-bits-limit</code> = 16
+ <dd>The following bits are defined:
+     <table border=1>
+       <tr><td><code>:control</code> <td><code>lisp:char-control-bit</code>
+       <tr><td><code>:meta</code> <td><code>lisp:char-meta-bit</code>
+       <tr><td><code>:super</code> <td><code>lisp:char-super-bit</code>
+       <tr><td><code>:hyper</code> <td><code>lisp:char-hyper-bit</code>
+     </table>
+ <dt><code>(lisp:char-font <var>object</var>)</code>
+ <dd>returns the font of a character or <code>sys::input-character</code>.
+ <dt><code>(lisp:char-bits <var>object</var>)</code>
+ <dd>returns the bits of a character or <code>sys::input-character</code>.
+ <dt><code>(lisp:make-char <var>char</var> [<var>bits</var>
+            [<var>font</var>]])</code>
+ <dd>returns a new <code>sys::input-character</code>, or
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> if
+     such a character cannot be created.
+ <dt><code>(lisp:char-bit <var>object</var> <var>name</var>)</code>
+ <dd>returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+     <code>t</code></a> if the named bit is set in <var>object</var>, else
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+ <dt><code>(lisp:set-char-bit <var>object</var> <var>name</var>
+            <var>newvalue</var>)</code>
+ <dd>returns a new <code>sys::input-character</code> with the named bit set
+     or unset, depending on the boolean <var>newvalue</var>.
+</dl>
+
+<!-- #ifdef KEYBOARD -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>, <strong>DOS</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong>, <strong>Acorn</strong>
+    platforms only.</em>
+<dd>The system itself uses this <code>sys::input-character</code> type
+    only to mention special keys and Control/Alternate/Shift key status
+    on return from
+    <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char.html">read-char</a>
+           <a href="#terminal">lisp:*keyboard-input*</a>)</code>.
+</dl>
+<!-- #endif -->
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-2-1.html">
+    13.1.2.1 Character Scripts</a></h3>
+
+The only defined character script is the type <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html"><code>character</code></a>
+itself.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-3.html">
+    13.1.3 Character Attributes</a></h3>
+
+Characters have no implementation-defined attributes. All characters
+are simple characters.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-4-1.html">
+    13.1.4.1 Graphic Characters</a></h3>
+
+The graphic characters are those Unicode characters which are defined by
+the Unicode standard, excluding the ranges <code>U0000..U001F</code> and
+<code>U007F..U009F</code>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-4-2.html">
+    13.1.4.2 Alphabetic Characters</a></h3>
+
+The alphabetic characters are those Unicode characters which are defined
+as letters by the Unicode standard.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-4-3-4.html">
+    13.1.4.3.4 Case of Implementation-Defined Characters</a></h3>
+
+The characters with case are those Unicode characters <var>c</var>, for
+which the upper case mapping <var>uc</var> and the lower case mapping
+<var>lc</var> have the following properties:
+<ul>
+  <li><var>uc</var> and <var>lc</var> are different,
+  <li><var>c</var> is one of <var>uc</var> and <var>lc</var>,
+  <li>the upper case mapping of <var>uc</var> and of <var>lc</var>
+  is <var>uc</var>,
+  <li>the lower case mapping of <var>uc</var> and of <var>lc</var>
+  is <var>lc</var>.
+</ul>
+The titlecase property of Unicode characters has no equivalent in
+Common Lisp.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-4-4.html">
+    13.1.4.4 Numeric Characters</a></h3>
+
+The numeric characters are those Unicode characters which are defined
+as digits by the Unicode standard.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-6.html">
+    13.1.6 Ordering of Characters</a></h3>
+
+The characters are ordered according to their Unicode code.
+
+<a name="clhs-newline"></a>
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-8.html">
+    13.1.8 Treatment of Newline during Input and Output</a></h3>
+
+Newlines are written according to the stream's encoding, see the
+function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-external-format.html">
+<code>stream-external-format</code></a> and the description of <a
+href="#encoding">encodings</a>, in particular, <a href="#newline">line
+terminators</a>.  The default behavior is as follows:
+
+<!-- #if defined(MSDOS) || defined(WIN32) || (defined(UNIX) && (O_BINARY != 0)) -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd>When writing to a file, <code>#\Newline</code> is converted to
+CR/LF. (This is the usual convention on DOS.) For example,
+<code>#\Return #\Newline</code> is written as CR/CR/LF.
+</dl>
+<!-- #endif -->
+
+<p>When reading from a file, CR/LF is converted to <code>#\Newline</code>
+(the usual convention on DOS), and CR not followed by LF is converted to
+<code>#\Newline</code> as well (the usual conversion on MacOS, also used
+by some programs on Win32).
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-9.html">
+    13.1.9 Character Encodings</a></h3>
+
+The integer returned by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_char-int.html"><code>char-int</code></a>
+is the same as the character's code.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_13-1-10.html">
+    13.1.10 Character Encodings</a></h3>
+
+See the description of <a href="#encoding">encodings</a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_chara_s_dictionary.html">
+    13.2. The Characters Dictionary</a></h3>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_char-code.html">
+<code>char-code</code></a> takes values from 0 (inclusive) to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_char-code-limit.html">
+<code>char-code-limit</code></a> (exclusive), i.e., the implementation
+supports exactly <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_char-code-limit.html">
+<code>char-code-limit</code></a> characters.
+<table border=1>
+ <tr> <th>binaries built ...
+      <th>without UNICODE support
+      <th>with UNICODE support
+ <tr> <th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_char-code-limit.html">
+          <code>char-code-limit</code></a>
+      <td align=center> 256 <td align=center> 65536
+</table>
+
+<p>The types <code>lisp:string-char</code> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_base-char.html"><code>base-char</code></a>
+are equivalent to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html"><code>character</code></a>.
+
+<p>The graphic characters have been described above.
+
+<p>The standard characters are <code>#\Newline</code> and the graphic
+characters with a code between 32 and 126 (inclusive).
+
+<p>The alphabetic characters are these characters:
+<pre>
+             ABCDEFGHIJKLMNOPQRSTUVWXYZ
+             abcdefghijklmnopqrstuvwxyz
+</pre>
+and the international alphabetic characters from the character set:
+<pre>
+             &Ccedil;&uuml;&eacute;&acirc;&auml;&agrave;&aring;&ccedil;&ecirc;&euml;&egrave;&iuml;&icirc;&igrave;&Auml;&Aring;&Eacute;&aelig;&AElig;&ocirc;&ouml;&ograve;&ucirc;&ugrave;&yuml;&Ouml;&Uuml;&szlig;&aacute;&iacute;&oacute;&uacute;&ntilde;&Ntilde;&ordf;&ordm;&atilde;&otilde;&Oslash;&oslash;&Agrave;&Atilde;&Otilde; etc.
+</pre>
+
+<p>The functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-equal</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-not-equal</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-lessp</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-greaterp</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-not-greaterp</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html">
+<code>char-not-lessp</code></a> ignore bits
+and font attributes of their arguments.
+
+<h4>Functions on characters</h4>
+
+<p><a name="char-width"></a><code>(<strong>lisp:char-width</strong>
+<var>character</var>)</code>
+returns the number of screen columns occupied by <var>character</var>.
+This is 0 for non-spacing characters (such as control characters and many
+combining characters), 2 for double-width East Asian characters, and 1 for
+all other characters.
+See also function <a href="#string-width"><code>string-width</code></a>.
+
+<h3>platform-dependent characters</h3>
+
+<p>The characters that are not graphic chars and the space character
+have names:
+
+<!-- #ifdef AMIGA_CHARNAMES -->
+<dl>
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+<dd><table>
+  <tr><td><code>(code-char #x00)</code><td>=<td><code>#\Null</code>
+  <tr><td><code>(code-char #x01)</code><td>=<td><code>#\Code1</code>
+  <tr><td><code>(code-char #x02)</code><td>=<td><code>#\Code2</code>
+  <tr><td><code>(code-char #x03)</code><td>=<td><code>#\Code3</code>
+  <tr><td><code>(code-char #x04)</code><td>=<td><code>#\Code4</code>
+  <tr><td><code>(code-char #x05)</code><td>=<td><code>#\Code5</code>
+  <tr><td><code>(code-char #x06)</code><td>=<td><code>#\Code6</code>
+  <tr><td><code>(code-char #x07)</code><td>=<td><code>#\Bell</code>
+      <td>=<td><code>#\Bel</code>
+  <tr><td><code>(code-char #x08)</code><td>=<td><code>#\Backspace</code>
+      <td>=<td><code>#\Bs</code>
+  <tr><td><code>(code-char #x09)</code><td>=<td><code>#\Tab</code>
+      <td>=<td><code>#\Ht</code>
+  <tr><td><code>(code-char #x0A)</code><td>=<td><code>#\Newline</code>
+      <td>=<td><code>#\Linefeed</code><td>=<td><code>#\Lf</code>
+  <tr><td><code>(code-char #x0B)</code><td>=<td><code>#\Vt</code>
+  <tr><td><code>(code-char #x0C)</code><td>=<td><code>#\Page</code>
+      <td>=<td><code>#\Ff</code>
+  <tr><td><code>(code-char #x0D)</code><td>=<td><code>#\Return</code>
+      <td>=<td><code>#\Cr</code>
+  <tr><td><code>(code-char #x0E)</code><td>=<td><code>#\So</code>
+  <tr><td><code>(code-char #x0F)</code><td>=<td><code>#\Si</code>
+  <tr><td><code>(code-char #x10)</code><td>=<td><code>#\Code16</code>
+  <tr><td><code>(code-char #x11)</code><td>=<td><code>#\Code17</code>
+  <tr><td><code>(code-char #x12)</code><td>=<td><code>#\Code18</code>
+  <tr><td><code>(code-char #x13)</code><td>=<td><code>#\Code19</code>
+  <tr><td><code>(code-char #x14)</code><td>=<td><code>#\Code20</code>
+  <tr><td><code>(code-char #x15)</code><td>=<td><code>#\Code21</code>
+  <tr><td><code>(code-char #x16)</code><td>=<td><code>#\Code22</code>
+  <tr><td><code>(code-char #x17)</code><td>=<td><code>#\Code23</code>
+  <tr><td><code>(code-char #x18)</code><td>=<td><code>#\Code24</code>
+  <tr><td><code>(code-char #x19)</code><td>=<td><code>#\Code25</code>
+  <tr><td><code>(code-char #x1A)</code><td>=<td><code>#\Code26</code>
+  <tr><td><code>(code-char #x1B)</code><td>=<td><code>#\Escape</code>
+      <td>=<td><code>#\Esc</code>
+  <tr><td><code>(code-char #x1C)</code><td>=<td><code>#\Code28</code>
+  <tr><td><code>(code-char #x1D)</code><td>=<td><code>#\Code29</code>
+  <tr><td><code>(code-char #x1E)</code><td>=<td><code>#\Code30</code>
+  <tr><td><code>(code-char #x1F)</code><td>=<td><code>#\Code31</code>
+  <tr><td><code>(code-char #x20)</code><td>=<td><code>#\Space</code>
+  <tr><td><code>(code-char #x7F)</code><td>=<td><code>#\Rubout</code>
+  <tr><td><code>(code-char #x9B)</code><td>=<td><code>#\Csi</code>
+  </table>
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(MSDOS_CHARNAMES) || defined(WIN32_CHARNAMES) -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd><table>
+  <tr><td><code>(code-char #x00)</code><td>=<td><code>#\Null</code>
+  <tr><td><code>(code-char #x07)</code><td>=<td><code>#\Bell</code>
+  <tr><td><code>(code-char #x08)</code><td>=<td><code>#\Backspace</code>
+      <td>=<td><code>#\Rubout</code>
+  <tr><td><code>(code-char #x09)</code><td>=<td><code>#\Tab</code>
+  <tr><td><code>(code-char #x0A)</code><td>=<td><code>#\Newline</code>
+      <td>=<td><code>#\Linefeed</code>
+  <tr><td><code>(code-char #x0B)</code><td>=<td><code>#\Code11</code>
+  <tr><td><code>(code-char #x0C)</code><td>=<td><code>#\Page</code>
+  <tr><td><code>(code-char #x0D)</code><td>=<td><code>#\Return</code>
+  <tr><td><code>(code-char #x1A)</code><td>=<td><code>#\Code26</code>
+  <tr><td><code>(code-char #x1B)</code><td>=<td><code>#\Escape</code>
+  <tr><td><code>(code-char #x20)</code><td>=<td><code>#\Space</code>
+  </table>
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef UNIX_CHARNAMES -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>Acorn</strong> platforms only.</em>
+<dd><table>
+  <tr><td><code>(code-char #x00)</code><td>=<td><code>#\Null</code>
+      <td>=<td><code>#\Nul</code>
+  <tr><td><code>(code-char #x01)</code><td>=<td><code>#\Soh</code>
+  <tr><td><code>(code-char #x02)</code><td>=<td><code>#\Stx</code>
+  <tr><td><code>(code-char #x03)</code><td>=<td><code>#\Etx</code>
+  <tr><td><code>(code-char #x04)</code><td>=<td><code>#\Eot</code>
+  <tr><td><code>(code-char #x05)</code><td>=<td><code>#\Enq</code>
+  <tr><td><code>(code-char #x06)</code><td>=<td><code>#\Ack</code>
+  <tr><td><code>(code-char #x07)</code><td>=<td><code>#\Bell</code>
+      <td>=<td><code>#\Bel</code>
+  <tr><td><code>(code-char #x08)</code><td>=<td><code>#\Backspace</code>
+      <td>=<td><code>#\Bs</code>
+  <tr><td><code>(code-char #x09)</code><td>=<td><code>#\Tab</code>
+      <td>=<td><code>#\Ht</code>
+  <tr><td><code>(code-char #x0A)</code><td>=<td><code>#\Newline</code>
+      <td>=<td><code>#\Nl</code><td>=<td><code>#\Linefeed</code>
+  <tr><td><code>(code-char #x0B)</code><td>=<td><code>#\Vt</code>
+  <tr><td><code>(code-char #x0C)</code><td>=<td><code>#\Page</code>
+      <td>=<td><code>#\Np</code>
+  <tr><td><code>(code-char #x0D)</code><td>=<td><code>#\Return</code>
+      <td>=<td><code>#\Cr</code>
+  <tr><td><code>(code-char #x0E)</code><td>=<td><code>#\So</code>
+  <tr><td><code>(code-char #x0F)</code><td>=<td><code>#\Si</code>
+  <tr><td><code>(code-char #x10)</code><td>=<td><code>#\Dle</code>
+  <tr><td><code>(code-char #x11)</code><td>=<td><code>#\Dc1</code>
+  <tr><td><code>(code-char #x12)</code><td>=<td><code>#\Dc2</code>
+  <tr><td><code>(code-char #x13)</code><td>=<td><code>#\Dc3</code>
+  <tr><td><code>(code-char #x14)</code><td>=<td><code>#\Dc4</code>
+  <tr><td><code>(code-char #x15)</code><td>=<td><code>#\Nak</code>
+  <tr><td><code>(code-char #x16)</code><td>=<td><code>#\Syn</code>
+  <tr><td><code>(code-char #x17)</code><td>=<td><code>#\Etb</code>
+  <tr><td><code>(code-char #x18)</code><td>=<td><code>#\Can</code>
+  <tr><td><code>(code-char #x19)</code><td>=<td><code>#\Em</code>
+  <tr><td><code>(code-char #x1A)</code><td>=<td><code>#\Sub</code>
+  <tr><td><code>(code-char #x1B)</code><td>=<td><code>#\Escape</code>
+      <td>=<td><code>#\Esc</code>
+  <tr><td><code>(code-char #x1C)</code><td>=<td><code>#\Fs</code>
+  <tr><td><code>(code-char #x1D)</code><td>=<td><code>#\Gs</code>
+  <tr><td><code>(code-char #x1E)</code><td>=<td><code>#\Rs</code>
+  <tr><td><code>(code-char #x1F)</code><td>=<td><code>#\Us</code>
+  <tr><td><code>(code-char #x20)</code><td>=<td><code>#\Space</code>
+      <td>=<td><code>#\Sp</code>
+  <tr><td><code>(code-char #x7F)</code><td>=<td><code>#\Rubout</code>
+      <td>=<td><code>#\Delete</code><td>=<td><code>#\Del</code>
+</table>
+</dl>
+<!-- #endif -->
+
+<h3>obsolete constants</h3>
+
+<table border=1>
+ <tr><th align=left><code>lisp:char-control-bit</code> <td> 1
+ <tr><th align=left><code>lisp:char-meta-bit</code>    <td> 2
+ <tr><th align=left><code>lisp:char-super-bit</code>   <td> 4
+ <tr><th align=left><code>lisp:char-hyper-bit</code>   <td> 8
+</table>
+
+
+<h2><a name="conses"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-14.html">
+    Chapter 14: Conses</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_conses_dictionary.html">
+    14.2 The Conses Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_subliscm_nsublis.html">sublis</a>,
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_subliscm_nsublis.html">nsublis</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_subliscm_nsublis.html"><code>sublis</code></a>
+and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_subliscm_nsublis.html"><code>nsublis</code></a>
+apply the <code>:key</code> argument to the nodes of the cons tree and not
+to the keys of the alist.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html">
+    mapcar, mapcan, maplist, mapcon, ...</a></h4>
+
+<p>The function <code><strong>lisp:mapcap</strong></code> is like
+<code>mapcan</code>, except that it concatenates the resulting lists
+with <code>append</code> instead of <code>nconc</code>:
+
+<br><code>(mapcap <var>fun</var> <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>)</code> ==
+ <code>(apply #'append (mapcar <var>fun</var> <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>))</code>
+
+<p>(Actually a bit more efficient that this would be.)
+
+<p>The function <code><strong>lisp:maplap</strong></code> is like
+<code>mapcon</code>, except that it concatenates the resulting lists
+with <code>append</code> instead of <code>nconc</code>:
+
+<br><code>(maplap <var>fun</var> <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>)</code> ==
+ <code>(apply #'append (maplist <var>fun</var> <var>x<sub>1</sub></var>
+... <var>x<sub>n</sub></var>))</code>
+
+<p>(Actually a bit more efficient that this would be.)
+
+<h2><a name="arrays"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-15.html">
+    Chapter 15: Arrays</a></h2>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-array.html"> <code>make-array</code></a>
+can return specialized arrays for the element types <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 2)</code>,
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+4)</code>, <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8)</code>,
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+16)</code>, <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 32)</code> and
+of course <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_bit.html"><code>bit</code></a> and <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html_character.html">
+<code>character</code></a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_15-1-1.html">
+    15.1.1 Array Elements</a></h3>
+
+<p><table border=1>
+<tr><th><em>Platform dependent:</em>
+    <th>16-bit CPU <th>32-bit CPU <th>64-bit CPU
+<tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_array-rank-limit.html">
+    <code>array-rank-limit</code></a>
+    <td colspan=2 align=center>2<sup>16</sup>=65536
+    <td>2<sup>32</sup>=4294967296
+<tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_array-_ension-limit.html">
+    <code>array-dimension-limit</code></a>
+    <td colspan=2 align=center>2<sup>24</sup>=16777216
+    <td>2<sup>32</sup>=4294967296
+<tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_array-_l-size-limit.html">
+    <code>array-total-size-limit</code></a>
+    <td colspan=2 align=center>2<sup>24</sup>=16777216
+    <td>2<sup>32</sup>=4294967296
+</table>
+
+<p>Note that these constants are not fixnums, contrary to the ANSI CL
+Issue <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss014.html">
+ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM</a>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_adjust-array.html">
+    adjust-array</a> for displaced arrays</h3>
+
+<p>An array to which another array is displaced should not be shrunk
+(using <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_adjust-array.html">
+<code>adjust-array</code></a>) in such a way that the other array
+points into void space.  This is not checked at the time
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_adjust-array.html">
+<code>adjust-array</code></a> is called!
+
+<h2><a name="strings"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-16.html">
+    Chapter 16: Strings</a></h2>
+
+<p>String comparison is based on the function
+<code>char&lt;=</code>. Therefore diphthongs do not obey the usual
+national rules. Example: <code>"o"</code> &lt;
+<code>"oe"</code> &lt; <code>"z"</code> &lt;
+<code>"&ouml;"</code>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_strings_dictionary.html">
+    16.2 The Strings Dictionary</a></h3>
+
+<h4>Functions on strings</h4>
+
+<p><a name="string-width"></a><code>(<strong>lisp:string-width</strong>
+<var>string</var>)</code>
+returns the number of screen columns occupied by <var>string</var>. This is
+computed as the sum of all <a href="#char-width"><code>char-width</code></a>s
+of all of the string's characters.
+
+<h2><a name="sequences"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-17.html">
+    Chapter 17: Sequences</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_seque_s_dictionary.html">
+    17.3. The Sequences Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_loop.html">loop</a>,
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_map.html">map</a></h4>
+
+<p>For iteration through a sequence, a macro
+<code><strong>lisp:doseq</strong></code>, similar to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_dolist.html">
+<code>dolist</code></a>, may be used instead of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_map.html">
+<code>map</code></a> :
+
+<p><code>(lisp:doseq (<var>var</var> <var>seqform</var>
+[<var>resultform</var>]) {<var>declaration</var>}*
+{<var>tag</var>|<var>statement</var>}* )</code>
+
+<p><code>lisp:doseq</code> forms are
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_i.html#iteration_form">
+<em>iteration forms</em></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_reversecm_nreverse.html">
+    nreverse</a></h4>
+
+<p>The result of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_reversecm_nreverse.html">
+<code>nreverse</code></a> is always
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+<code>eq</code></a> to the argument.
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_reversecm_nreverse.html">
+<code>nreverse</code></a> on a vector swaps pairs of elements.
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_reversecm_nreverse.html">
+<code>nreverse</code></a> on a list swaps the first and the last
+element and reverses the list chaining between them.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_revappendcm_nreconc.html">
+    nreconc</a></h4>
+
+<p>The result of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_revappendcm_nreconc.html">
+<code>nreconc</code></a> is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+<code>eq</code></a> to the first argument unless it is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>,
+in which case the result is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+<code>eq</code></a> to the second argument.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+    remove/delete</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>remove</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>remove-if</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>remove-if-not</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_remove-du_e-duplicates.html">
+<code>remove-duplicates</code></a> return their
+argument unchanged, if no element has to be removed.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>delete</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>delete-if</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_removecm__elete-if-not.html">
+<code>delete-if-not</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_remove-du_e-duplicates.html">
+<code>delete-duplicates</code></a> destructively
+modify their argument: If the argument is a list, the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html">
+<code>cdr</code></a> parts are modified. If the argument is a vector
+with fill pointer, the fill pointer is lowered and the remaining
+elements are compacted below the new fill pointer.
+
+<a name="count-ansi"></a>
+<p>Contrary to the ANSI CL issue 283 <a
+href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss283.html">
+RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER</a>, negative <code>:count</code>
+keyword arguments are not allowed unless you set
+<code><strong>lisp:*sequence-count-ansi*</strong></code> to a non-<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> value, in
+which case "using a negative integer value is functionally equivalent to
+using a value of zero", as per the ANSI CL issue.
+
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_sortcm_stable-sort.html">
+    sort</a></h4>
+
+<p><code>sort</code> and <code>stable-sort</code> have two additional
+keywords <code>:start</code> and <code>:end</code>:
+<pre><code>  (sort <var>sequence</var> <var>predicate</var> &amp;key :key :start :end)
+  (stable-sort <var>sequence</var> <var>predicate</var> &amp;key :key :start :end)
+</code></pre>
+
+<p><code>sort</code> and <code>stable-sort</code> are identical. They
+implement the mergesort algorithm.  Worst case complexity:
+<var>O(n*log(n))</var> comparisons, where <var>n</var> is the length of
+the subsequence bounded by the <code>:start</code> and <code>:end</code>
+arguments.
+
+<h2><a name="hash"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-18.html">
+    Chapter 18: Hash Tables</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_hash__s_dictionary.html">
+    18.2. The Hash Tables Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-hash-table.html">
+    make-hash-table</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-hash-table.html">
+<code>make-hash-table</code></a> has an additional keyword
+<code>:initial-contents</code>:
+
+<pre><code>(make-hash-table &amp;key :test :initial-contents :size
+                 :rehash-size :rehash-threshold)</code></pre>
+
+<p>The <code>:initial-contents</code> argument is an alist that is used
+to initialize the new hash table.  The <code>:rehash-threshold</code>
+argument is ignored.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_loop.html">loop</a>,
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_maphash.html">maphash</a></h4>
+
+<p>For iteration through a hash table, a macro
+<code><strong>lisp:dohash</strong></code>, similar to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_dolist.html">
+<code>dolist</code></a>, can be used instead of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_maphash.html">
+<code>maphash</code></a>:
+
+<pre><code>(lisp:dohash (<var>key-var</var> <var>value-var</var> <var>hash-table-form</var> [<var>resultform</var>])
+  {<var>declaration</var>}* {<var>tag</var>|<var>statement</var>}*
+)
+</code></pre>
+
+<code>lisp:dohash</code> forms are
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_i.html#iteration_form">
+<em>iteration forms</em></a>.
+
+
+<h2><a name="filenames"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-19.html">
+    Chapter 19: Filenames</a></h2>
+
+<p>For most operations, pathnames denoting files and pathnames denoting
+directories can not be used interchangeably.
+
+<dl>
+<!-- #if defined(PATHNAME_UNIX) || defined(PATHNAME_AMIGAOS) -->
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>Amiga</strong> platforms only.</em>
+<dd>For example, <code>#p"FOO/BAR"</code> denotes the file
+<code>BAR</code> in the directory <code>FOO</code>, while
+<code>#p"FOO/BAR/"</code> denotes the subdirectory
+<code>BAR</code> of the directory <code>FOO</code>.
+<!-- #endif -->
+
+<!-- #if defined(PATHNAME_MSDOS) || defined(PATHNAME_OS2) || defined(PATHNAME_WIN32) -->
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd>For example, <code>#p"FOO\\BAR"</code> denotes the file
+<code>BAR</code> in the directory <code>FOO</code>, while
+<code>#p"FOO\\BAR\\"</code> denotes the subdirectory
+<code>BAR</code> of the directory <code>FOO</code>.
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_RISCOS -->
+<dt><em>Platform dependent: <strong>Acorn</strong> platforms only.</em>
+<dd>For example, <code>#p"FOO.BAR"</code> denotes the file
+<code>FOO</code> in the directory <code>BAR</code>, while
+<code>#p"FOO.BAR."</code> denotes the subdirectory
+<code>BAR</code> of the directory <code>FOO</code>.
+<!-- #endif -->
+
+</dl>
+This is especially important for the functions <a
+href="#dir"><code>directory</code>, <code>lisp:dir</code>,
+<code>lisp:cd</code>, <code>lisp:make-dir</code>,
+<code>lisp:delete-dir</code></a>.
+
+<p>The minimum filename syntax that may be used portably is:
+<table>
+  <tr> <td><code>&#34;<var>xxx</var>&#34;</code>
+       <td>for a file with name <var>xxx</var>,
+  <tr> <td><code>&#34;<var>xxx</var>.<var>yy</var>&#34;</code>
+       <td>for a file with name <var>xxx</var> and type <var>yy</var>,
+  <tr> <td><code>&#34;.<var>yy</var>&#34;</code>
+       <td>for a pathname with type <var>yy</var> and no name specified.
+</table>
+
+<p>Hereby <var>xxx</var> denotes 1 to 8 characters, and <var>yy</var>
+denotes 1 to 3 characters, each of which being either an alphanumeric
+character or the underscore <code>#\_</code>.  Other properties of
+pathname syntax vary between operating systems.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_19-2-1.html">
+    19.2.1 Pathname Components</a></h3>
+
+<!-- #ifdef PATHNAME_MSDOS -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong> platforms only.</em>
+<dd>
+Pathname components:
+<dl>
+<dt><code>host</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+<dt><code>device</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+    <code>nil</code></a> or <code>:wild</code> or
+    <code>"A"</code>|...|<code>"Z"</code>
+<dt><code>directory</code>
+ <dd><code>(<var>startpoint</var> . <var>subdirs</var>)</code> where
+            <br><var>startpoint</var> = <code>:relative</code> |
+                <code>:absolute</code>
+            <br><var>subdirs</var> = <code>()</code> |
+                <code>(<var>subdir</var> . <var>subdirs</var>)</code>
+            <br><var>subdir</var> = <code>:current</code> (means
+                <code>"."</code>) or
+            <br><var>subdir</var> = <code>:parent</code> (means
+                <code>".."</code>) or
+            <br><var>subdir</var> = <code>:wild-inferiors</code> (means
+                <code>"..."</code>, all subdirectories) or
+            <br><var>subdir</var> = <code>(<var>name</var>
+                . <var>type</var>)</code>
+            <br><var>name</var> = <code>:wild</code> or a
+                <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+                <code>simple-string</code></a> of length at most 8
+            <br><var>type</var> = <code>:wild</code> or a
+                <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+                <code>simple-string</code></a> of length at most 3
+<dt><code>name</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> or
+ <code>:wild</code> or a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a> of length at most 8
+<dt><code>type</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> or
+ <code>:wild</code> or a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a> of length at most 3
+<dt><code>version</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> (may also be specified as
+ <code>:wild</code> or <code>:newest</code>)
+</dl>
+
+<p>When a pathname is to be fully specified (no wildcards), that means
+that no <code>:wild</code>, <code>:wild-inferiors</code> is allowed, and
+<var>name</var> = <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> may not be allowed either.
+
+<p><table>
+  <tr> <td>External notation:
+   <td align=right><code>A:\sub1.typ\sub2.typ\name.typ</code>
+  <tr> <td>using defaults:
+   <td align=right><code>  \sub1.typ\sub2.typ\name.typ</code>
+  <tr> <td>or
+   <td align=right><code>                     name.typ</code>
+  <tr> <td>or
+   <td align=left><code>*:\sub1.typ\*.*\name.*</code>
+  <tr> <td>or similar.
+</table>
+
+<p> Instead of <code>'\'</code> one may use <code>'/'</code>, as usual
+for DOS calls.
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_AMIGAOS -->
+<dl>
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+ <dd> Pathname components:
+ <dl>
+  <dt><code>host</code>
+   <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+    <code>nil</code></a>
+  <dt><code>device</code>
+   <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+    <code>nil</code></a> or a
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+    <code>simple-string</code></a>
+  <dt><code>directory</code>
+   <dd><code>(<var>startpoint</var> . <var>subdirs</var>)</code> where
+    <br><var>startpoint</var> = <code>:relative</code> | <code>:absolute</code>
+   <br><var>subdirs</var> = <code>()</code> |
+       <code>(<var>subdir</var> . <var>subdirs</var>)</code>
+   <br><var>subdir</var> = <code>:wild-inferiors</code>
+    (means <code>"**"</code> or <code>"..."</code>,
+    all subdirectories) or
+   <br><var>subdir</var> = <code>:parent</code>
+    (means <code>"/"</code> instead of
+    <code>"subdir/"</code>) or
+   <br><var>subdir</var> = <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+    <code>simple-string</code></a>, may contain wildcard
+    characters <code>?</code> and <code>*</code>
+  <dt><code>name</code>
+   <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+   <code>simple-string</code></a>, may contain wildcard
+   characters <code>?</code> and <code>*</code> (may also be specified
+   as <code>:wild</code>)
+  <dt><code>type</code>
+   <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+   <code>simple-string</code></a>, may contain wildcard
+   characters <code>?</code> and <code>*</code> (may also be specified
+   as <code>:wild</code>)
+  <dt><code>version</code>
+   <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a> (may also be specified as
+   <code>:wild</code> or <code>:newest</code>)
+</dl>
+
+<p>Constraint: <var>startpoint</var> = <code>:relative</code> only if
+<var>device</var> is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>. If the device is specified, the
+pathname must be absolute!
+
+<p>A filename from AMIGAOS is split into name and type according to the
+following rule:
+<ul>
+ <li>if there is no <code>'.'</code> in the filename, then the
+  <var>name</var> is everything, <var>type</var> is
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>;
+ <li>if there is a <code>'.'</code>, then <var>name</var> is the part
+  before and <var>type</var> the part after the last dot.
+</ul>
+
+<p>Case is ignored in the strings on comparison. No case conversions
+are performed.
+
+<p>When a pathname is to be fully specified (no wildcards), that means
+that no <code>:wild</code>, <code>:wild-inferiors</code> is allowed, no
+wildcard characters are allowed in the strings, and <var>name</var> =
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> may not be allowed either.
+
+<p><a name="pathnames-externally-amiga"></a>
+<table>
+  <tr> <td>External notation:
+    <td align=right><code>dev:sub1.typ/sub2.typ/name.typ</code>
+  <tr> <td>using defaults:
+    <td align=right><code>    sub1.typ/sub2.typ/name.typ</code>
+  <tr> <td>or
+    <td align=right><code>                      name.typ</code>
+  <tr> <td>or
+    <td align=right><code>    sub1.typ/**/sub3.typ/x*.lsp</code>
+  <tr> <td>or similar.
+</table>
+
+<p> Formal specification of the external notation:
+<dl>
+  <dt>ch ::= <dd>any character except ':','/' and '*','?'
+  <dt>name ::= <dd>{ch}+
+  <dt>device ::= <dd>[ &lt;empty&gt; | ':' | name ':' ]
+       <br>; empty = current device, relative to current directory
+       <br>; ':'   = current device, absolute (relative to root for disks)
+       <br>; name ':' = specified device, absolute (relative to root for disks)
+  <dt>subdir ::= <dd>[ &lt;empty&gt; | name ]
+       <br>; empty means parent directory
+  <dt>pathname ::= <dd>device { subdir '/' }* name
+</dl>
+
+<p>Examples:
+
+<p><table border=1>
+<tr><th>String <th>Device <th>Directory <th>our pathname
+<tr><td><code>'c:foo'</code>
+    <td>'C'
+    <td>device-&gt;<code>foo</code>
+    <td><code>"c" (:absolute "foo")</code>
+<tr><td><code>'c:foo/'</code>
+    <td>'C'
+    <td>device-&gt;<code>foo</code>
+    <td><code>"c" (:absolute "foo")</code>
+<tr><td><code>'c:foo/bar'</code>
+    <td>'C'
+    <td>device-&gt;<code>foo</code>-&gt;<code>bar</code>
+    <td><code>"c" (:absolute "foo" "bar")</code>
+<tr><td><code>'c:/foo'</code>
+    <td>'C'
+    <td>device-&gt;up-&gt;<code>foo</code>
+    <td><code>"c" (:absolute :parent "foo")</code>
+<tr><td><code>'c:'</code>
+    <td>'C'
+    <td>device
+    <td><code>"c" (:absolute)</code>
+<tr><td><code>':foo'</code>
+    <td>current
+    <td>device-&gt;root-&gt;<code>foo</code>
+    <td><code>nil (:absolute "foo")</code>
+<tr><td><code>'foo'</code>
+    <td>current <td>device-&gt;<code>foo</code>
+    <td><code>nil (:relative "foo")</code>
+<tr><td><code>'/foo'</code>
+    <td>current <td>device-&gt;up-&gt;<code>foo</code>
+    <td><code>nil (:relative :parent "foo")</code>
+<tr><td><code>'//foo/bar'</code>
+    <td>current
+    <td>device-&gt;up-&gt;up-&gt;<code>foo</code>-&gt;<code>bar</code>
+    <td><code>nil (:relative :parent :parent
+                   "foo" "bar")</code>
+<tr><td><code>''</code>
+    <td>current <td>device
+    <td><code>nil (:relative)</code>
+</table>
+
+<p>Appending a <code>'/'</code> to a path string that is non-empty and
+does not end with <code>':'</code> or <code>'/'</code> does not change
+its meaning. This <code>'/'</code> must be appended before another
+non-empty component can be appended.  But appending a <code>'/'</code>
+to a path string that is empty or ends with <code>':'</code> or
+<code>'/'</code> means going up to the parent directory!
+
+<br>We interpret any path string that is empty or ends with
+<code>':'</code> or <code>'/'</code> as pathname of a directory (with
+both <var>name</var> and <var>type</var> being
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>).
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_UNIX -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+<dd>
+Pathname components:
+<dl>
+<dt><code>host</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+<dt><code>device</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+<dt><code>directory</code>
+ <dd><code>(<var>startpoint</var> . <var>subdirs</var>)</code> where
+  <br><var>startpoint</var> = <code>:relative</code> | <code>:absolute</code>
+  <br><var>subdirs</var> = <code>()</code> |
+             <code>(<var>subdir</var> . <var>subdirs</var>)</code>
+  <br><var>subdir</var> = <code>:wild-inferiors</code>
+      (means <code>"**"</code> or <code>"..."</code>,
+      all subdirectories) or
+  <br><var>subdir</var> = <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+      <code>simple-string</code></a>, may contain wildcard characters
+      <code>?</code> and <code>*</code>
+<dt><code>name</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code> and <code>*</code> (may also be specified as
+ <code>:wild</code>)
+<dt><code>type</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code> and <code>*</code> (may also be specified as
+ <code>:wild</code>)
+<dt><code>version</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> (may also be specified as
+ <code>:wild</code> or <code>:newest</code>)
+</dl>
+
+<p>A UNIX filename is split into name and type according to the
+following rule:
+<ul>
+ <li>if there is no <code>'.'</code> in the filename, then the
+  <var>name</var> is everything, <var>type</var> is <a
+  href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>;
+ <li>if there is a <code>'.'</code>, then <var>name</var> is the part
+  before and <var>type</var> the part after the last dot.
+</ul>
+
+<p>When a pathname is to be fully specified (no wildcards), that means
+that no <code>:wild</code>, <code>:wild-inferiors</code> is allowed, no
+wildcard characters are allowed in the strings, and <var>name</var> =
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> may not be allowed either.
+
+<p><table>
+  <tr> <td>External notation:
+   <td align=right><code>server:sub1.typ/sub2.typ/name.typ</code>
+  <tr> <td>using defaults:
+   <td align=right><code>       sub1.typ/sub2.typ/name.typ</code>
+  <tr> <td>or
+   <td align=right><code>                         name.typ</code>
+  <tr> <td>or
+   <td align=right><code>       sub1.typ/**/sub3.typ/x*.lsp</code>
+  <tr> <td>or similar.
+</table>
+</dl>
+<!-- #endif -->
+<!-- #if defined(PATHNAME_OS2) || defined(PATHNAME_WIN32) -->
+<dl>
+<dt><em>Platform dependent: <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd>
+Pathname components:
+<dl>
+<dt><code>host</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+<dt><code>device</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <code>:wild</code>
+ or <code>"A"</code>|...|<code>"Z"</code>
+<dt><code>directory</code>
+ <dd><code>(<var>startpoint</var> . <var>subdirs</var>)</code> where
+  <br><var>startpoint</var> = <code>:relative</code> | <code>:absolute</code>
+  <br><var>subdirs</var> = <code>()</code> |
+      <code>(<var>subdir</var> . <var>subdirs</var>)</code>
+  <br><var>subdir</var> = <code>:wild-inferiors</code> (
+      means <code>"**"</code> or <code>"..."</code>, all
+      subdirectories) or
+  <br><var>subdir</var> = <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+      <code>simple-string</code></a>, may contain wildcard characters
+      <code>?</code> and <code>*</code>
+<dt><code>name</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code> and <code>*</code> (may also be specified as
+ <code>:wild</code>)
+<dt><code>type</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code> and <code>*</code> (may also be specified as
+ <code>:wild</code>)
+<dt><code>version</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> (may also be specified as
+ <code>:wild</code> or <code>:newest</code>)
+</dl>
+
+<p>An OS/2 filename is split into name and type according to the
+following rule:
+<ul>
+ <li>if there is no <code>'.'</code> in the filename, then the
+  <var>name</var> is everything, <var>type</var> is
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>;
+ <li>if there is a <code>'.'</code>, then <var>name</var> is the part
+  before and <var>type</var> the part after the last dot.
+</ul>
+
+<p>When a pathname is to be fully specified (no wildcards), that means
+that no <code>:wild</code>, <code>:wild-inferiors</code> is allowed, no
+wildcard characters are allowed in the strings, and <var>name</var>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eq.html">
+<code>eq</code></a> <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> may not be allowed either.
+
+<p><table>
+  <tr> <td>External notation:
+   <td align=right><code>A:\sub1.typ\sub2.typ\name.typ</code>
+  <tr> <td>using defaults:
+   <td align=right><code>  \sub1.typ\sub2.typ\name.typ</code>
+  <tr> <td>or
+   <td align=right><code>                     name.typ</code>
+  <tr> <td>or
+   <td align=left><code>*:\sub1.typ\**\sub3.typ\x*.lsp</code>
+  <tr> <td>or similar.
+</table>
+
+<p>Instead of '\' one may use '/', as usual for DOS calls.
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_NOEXT -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong>,
+    <strong>Amiga</strong> platforms only.</em>
+<dd>The wildcard characters: <code>'*'</code> matches any sequence of
+characters, <code>'?'</code> matches any one character.
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_NOEXT -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong>,
+    <strong>Amiga</strong> platforms only.</em>
+<dd>Due to the name/type splitting rule, there are pathnames that cannot
+result from <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_parse-namestring.html">
+<code>parse-namestring</code></a>. To get a pathname whose type
+contains a dot or whose name contains a dot and whose type is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-pathname.html">
+<code>make-pathname</code></a> must be used.  Example:
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-pathname.html">make-pathname</a>
+:name ".profile")</code>.
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef PATHNAME_RISCOS -->
+<dl>
+<dt><em>Platform dependent: <strong>Acorn</strong> platforms only.</em>
+<dd>RISC OS provides several file systems as standard (ADFS, IDEFS,
+NetFS, RamFS, NetPrint) and support for extra file systems (DOSFS,
+ResourceFS and DeviceFS).
+
+<p>A module called FileSwitch is at the center of all file system
+operation in RISC OS. FileSwitch provides a common core of functions
+used by all file systems. It only provides the parts of these services
+that are device independent. The device dependent services that control
+the hardware are provided by separate modules, which are the actual
+file systems.  FileSwitch keeps track of active file systems and
+switches between them as necessary.
+
+<p>One of the file system modules that RISC OS provides is
+FileCore. It takes the normal calls that FileSwitch sends to a file
+system module, and converts them to a simpler set of calls to modules
+that control the hardware. Unlike FileSwitch it creates a fresh
+instantiation of itself for each module that it supports. Using FileCore
+to build file system modules imposes a more rigid structure on it, as
+more of the file system is predefined.
+
+<p>As well as standard file systems, FileSwitch supports image file
+systems. These provide facilities for RISC OS to handle media in foreign
+formats, and to support `image files' (or partitions) in those formats.
+Rather than accessing the hardware directly they rely on standard RISC
+OS file systems to do so. DOSFS is an example of an image file
+system used to handle DOS format discs.
+
+<p><dl>
+ <dt>Terminology
+
+ <dd>A pathname may include a file system name, a special field, a media
+name (e.g., a disc name), directory name(s), and the name of the object
+itself; each of these parts of a pathname is known as an `element' of
+the pathname.
+
+ <p><dt>Filenames
+
+ <dd>Filename `elements' may be up to ten characters in length on
+FileCore-based file systems and on NetFS. These characters may be digits
+or letters.  FileSwitch makes no distinction between upper and lower
+case, although file systems can do so. As a general rule, you should not
+use top-bit-set characters in filenames, although some file systems
+(such as FileCore-based ones) support them. Other characters may be used
+provided they do not have a special significance. Those that do are
+listed below :
+<dl>
+  <dt> .   <dd>Separates directory specifications, e.g., $.fred
+  <dt> :   <dd>Introduces a drive or disc specification, e.g., :0,
+           :bigdisc. It also marks the end of a file system name, e.g., adfs:
+  <dt> *   <dd>Acts as a `wildcard' to match zero or more characters.
+  <dt> #   <dd>Acts as a `wildcard' to match any single character.
+  <dt> $   <dd>is the name of the root directory of the disc.
+  <dt> &amp;   <dd>is the user root directory (URD)
+  <dt> @   <dd>is the currently selected directory (CSD)
+  <dt> ^   <dd>is the `parent' directory
+  <dt> %   <dd>is the currently selected library (CSL)
+  <dt> \   <dd>is the previously selected directory (PSD)
+</dl>
+
+ <p><dt>Directories
+
+ <dd>The root directory, $, forms the top of the directory hierarchy of
+the media which contains the CSD. $ does not have a parent directory,
+trying to access its parent will just access $. Each directory name is
+separated by a '.' character. For example:
+<table>
+  <tr> <td> $.Documents.Memos
+  <tr> <td> %.cc
+</table>
+
+ <p><dt>File Systems
+
+ <dd>Files may also be accessed on file systems other than the current
+one by prefixing the filename with a file system specification. A file
+system name may appear between '-' characters, or suffixed by a ':',
+though the latter is advised since '-' can also be used to introduce a
+parameter on a command line, or as part of a file name. For example:
+<table>
+  <tr> <td> -net-$.SystemMesg
+  <tr> <td> adfs:%.aasm
+</table>
+
+ <p><dt>Special Fields
+
+ <dd>Special fields are used to supply more information to the file
+system than you can using standard path names; for example NetFS and
+NetPrint use them to specify server addresses or names. They are
+introduced by a '#' character; a variety of syntaxes are possible:
+<table>
+  <tr> <td align=right>  net#MJHardy::disc1.mike
+  <tr> <td align=right>     #MJHardy::disc1.mike
+  <tr> <td align=right> -net#MJHardy-:disc1.mike
+  <tr> <td align=right>    -#MJHardy-:disc1.mike
+</table>
+ The special fields here are all MJHardy, and give the name of the
+fileserver to use. Special fields may use any character except for
+control characters, double quote '&#34;', solidus '|' and space. If a
+special field contains a hyphen you may only use the first two syntaxes
+given above.
+
+ <p><dt>File$Path and Run$Path
+
+ <dd>These two special variables control exactly where a file will be
+looked for, according to the operation being performed on it.
+<table>
+   <tr> <td>File$Path   <td>for read operations
+   <tr> <td>Run$Path    <td>for execute operations
+</table>
+The contents of each variable should expand to a list or prefixes,
+separated by commas. When a read operation is performed then the
+prefixes in File$Path are used in the order in which they are
+listed. The first object that matches is used, whether it be a file or
+directory. Similarly any execute operation uses the prefixes in
+Run$Path. These search paths are only used when the pathname does not
+contain an explicit file system reference, e.g., executing adfs:file
+will not use Run$Path.
+
+ <p><dt>Other path variables
+
+ <dd>You can set up other path variables and use them as pseudo file
+systems.  For example if you typed:
+<table>
+  <tr> <td> *Set Source$Path adfs:$.src.,adfs:$.public.src.
+</table>
+you could then refer to the pseudo file system as Source: or (less
+preferable) as -Source-. These path variables work in the same was as
+File$Path and Run$Path.
+
+<p>NOTE: Path variables are not implemented in this version of CLISP. A
+workaround for this is to use &#34;&lt;Foo$Path&gt;&#34; instead of
+"Foo:" until they are made available.
+
+ <p><dt><a name="pathnames-externally-acorn">
+     from Lisp-string notation to internal representation</a>
+
+ <dd><em>No</em> swapping. "foo.lsp" means file type
+"lsp" and file name "foo". This is pseudo-BNF:
+<dl>
+<dt>legal character ::= <dd>any ISO latin-1 graphic character &gt;= ' ' except
+                    '.' ':' '*' '#' '$' '&amp;' '@' '^' '%' '\' '?'
+
+<dt>extended legal character ::= <dd>any ISO latin-1 graphic character &gt;= ' ' except
+                             ':' '&#34;' '|'
+
+<dt>legal-wild char ::= <dd>legal char | '*' | '#' | '?'
+
+<dt>host ::=  <dd> '-' { extended legal char except '-' }+ '-'
+         | { extended legal char except '-' } { extended legal char }* ':'
+         | empty
+
+<dt>device ::=  <dd> ':' { legal char }+ '.'
+           | empty
+
+<dt>directory ::=  <dd> { '$' | '&amp;' | '@' | '%' | '\' } '.' { subdirectory }*
+              | { subdirectory }+
+              | empty
+<table>
+  <tr> <td> '$' -&gt; <td><code>:absolute :root</code>
+  <tr> <td> '&amp;' -&gt; <td><code>:absolute :home</code>
+  <tr> <td> '@' -&gt; <td><code>:absolute :current</code>
+  <tr> <td> '%' -&gt; <td><code>:absolute :library</code>
+  <tr> <td> '\' -&gt; <td><code>:absolute :previous</code>
+  <tr> <td> else <td><code>:relative</code>
+</table>
+
+<dt>subdirectory ::= <dd>{ '^' | { legal-wild char }+ } '.'
+<table>
+  <tr> <td> '^' -&gt; <td><code>:parent</code>
+</table>
+
+<dt>filename ::= <dd>{ { legal-wild char }+ | empty }
+
+<dt>filetype ::= <dd>{ '.' { legal-wild char }+ | empty }
+
+<dt>pathname ::= <dd>host device directory filename filetype
+</dl>
+Examples:
+<table border=1>
+  <tr><th>String <th>Hostname <th>Device  <th>Directory <th>Name <th>Type
+  <tr><td><code>-net-$.SystemMesg</code>
+      <td><code>"net"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :root)</code>
+      <td><code>"SystemMesg"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>net#MJHardy::disc1.mike</code>
+      <td><code>"net#MJHardy"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root)</code>
+      <td><code>"mike"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>#MJHardy::disc1.mike</code>
+      <td><code>"#MJHardy"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root)</code>
+      <td><code>"mike"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>-net#MJHardy-:disc1.mike</code>
+      <td><code>"net#MJHardy"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root)</code>
+      <td><code>"mike"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>-#MJHardy-:disc1.mike</code>
+      <td><code>"#MJHardy"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root)</code>
+      <td><code>"mike"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>@.foo</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :current)</code>
+      <td><code>"foo"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>foo</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative)</code>
+      <td><code>"foo"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>^.</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative :parent)</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>@.^.</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :current :parent)</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>foo.bar</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative)</code>
+      <td><code>"foo"</code>
+      <td><code>"bar"</code>
+  <tr><td><code>foo.bar.baz</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative "foo")</code>
+      <td><code>"bar"</code>
+      <td><code>"baz"</code>
+  <tr><td><code>foo.bar.</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative "foo" "bar")</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr><td><code>foo.@.</code>
+      <td colspan=5 align=center>illegal
+</table>
+
+ <p><dt>From internal representation to RISCOS string
+
+ <dd>with swapping <em>only</em> of name/type components.
+
+<p><table border=1>
+  <tr><th>Hostname <th>Device <th>Directory <th>Name <th>Type <th>RISCOS String
+  <tr><td><code>"net"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root)</code>
+      <td><code>"foo"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"net::disc1.$.foo"</code>
+  <tr><td><code>"net#MJ"</code>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root "foo")</code>
+      <td><code>"bar"</code>
+      <td><code>"baz"</code>
+      <td><code>"net#MJ::disc1.$.foo.baz.bar"</code>
+  <tr><td><code>"adfs"</code>
+      <td><code>"4"</code>
+      <td><code>(:absolute :root "foo" "bar")</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"adfs::4.$.foo.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :root "foo")</code>
+      <td><code>"bar"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>":disc1.$.foo.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"disc1"</code>
+      <td><code>(:absolute :current)</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td>illegal here
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"disc1"</code>
+      <td><code>(:relative)</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>":disc1."</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"disc1"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>":disc1."</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :root)</code>
+      <td><code>"foo"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"$.foo"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :current)</code>
+      <td><code>"foo"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"@.foo"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative)</code>
+      <td><code>"foo"</code>
+      <td><code>"bar"</code>
+      <td><code>"bar.foo"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative "foo")</code>
+      <td><code>"bar"</code>
+      <td><code>"baz"</code>
+      <td><code>"foo.baz.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :library)</code>
+      <td><code>"bar"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"%.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:absolute :library "foo")</code>
+      <td><code>"bar"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"%.foo.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative)</code>
+      <td><code>"foo"</code>
+      <td><code>"bar"</code>
+      <td><code>"bar.foo"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative "foo")</code>
+      <td><code>"bar"</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"foo.bar"</code>
+  <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>(:relative "foo")</code>
+      <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>"bar"</code>
+      <td>illegal here
+</table>
+
+<p>That is, the RISCOS string is the flattening-concatenation of
+
+<pre><code>
+  (append
+    (if (null hostname) "" (append hostname ":"))
+    (if (null device) "" (append ":" device "."))
+    (case (pop directory)
+      (:absolute (case (pop directory)
+                         (:root "$.")
+                         (:home &#34;&amp;.&#34;)
+                         (:current "@.")
+                         (:library "%.")
+                         (:previous "\\.")
+      )          )
+      (:relative "")
+    )
+    (mapcar (lambda (subdir) (append subdir ".")) directory)
+    (if (null name)
+      (if (null type) "" (error "type with name illegal here"))
+      (if (null type)
+        name
+        (append type "." name)
+  ) ) )
+</code></pre>
+
+ <p><dt>internal representation
+
+ <dd>Pathname components:
+<dl>
+<dt><code>host</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+  <code>simple-string</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+  <code>nil</code></a>
+<dt><code>device</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+  <code>simple-string</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+  <code>nil</code></a>
+<dt><code>directory</code>
+ <dd><code>(<var>Startpoint</var> . <var>Subdirs</var>)</code> where
+     <br><var>Startpoint</var> = <code>:relative</code> |
+                                 <code>:absolute</code> <var>anchor</var>
+     <br><var>anchor</var> = <code>:root</code> | <code>:home</code> |
+         <code>:current</code> | <code>:library</code> | <code>:previous</code>
+     <br><var>Subdirs</var> = <code>()</code> |
+         <code>(<var>subdir</var> . <var>Subdirs</var>)</code>
+     <br><var>subdir</var> = <code>:parent</code> or
+     <br><var>subdir</var> = <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+         <code>simple-string</code></a>, may contain wildcard
+         characters <code>?</code>,<code>#</code> and <code>*</code>
+<dt><code>name</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> or
+ <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code>,<code>#</code> and <code>*</code> (may also be specified
+ as <code>:wild</code>)
+<dt><code>type</code>
+ <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> or
+ <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_simple-string.html">
+ <code>simple-string</code></a>, may contain wildcard characters
+ <code>?</code>,<code>#</code> and <code>*</code> (may also be specified
+ as <code>:wild</code>)
+<dt><code>version</code>
+ <dd>always <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+ (may also be specified as <code>:wild</code> or <code>:newest</code>)
+</dl>
+
+<p>Constraint: startpoint is not <code>:absolute :root</code> only if
+device is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>. If the device is specified, the pathname must be
+<code>:absolute :root</code>.
+
+<p>The wildcard characters: <code>'*'</code> matches any sequence of
+characters, <code>'#'</code> or <code>'?'</code> matches any one
+character.
+
+<p>Due to the name/type swapping rule, there are pathnames that cannot
+result from <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_parse-namestring.html">
+<code>parse-namestring</code></a>. To get a pathname whose type
+is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-pathname.html">
+<code>make-pathname</code></a> must be used.  Example:
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-pathname.html">make-pathname</a>
+       :directory "!Clisp." :name "README")</code>.
+</dl>
+</dl>
+<!-- #endif -->
+
+<h3>External notation.</h3>
+
+<p>External notation of pathnames (cf.
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_parse-namestring.html">
+<code>parse-namestring</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_namestrin_h-namestring.html">
+<code>namestring</code></a>), of course without spaces, [,],{,}:
+<dl>
+<!-- #ifdef PATHNAME_MSDOS -->
+<dt><em>Platform dependent: <strong>DOS</strong> platforms only.</em>
+<dd>
+<table>
+ <tr><td>[ [drivespec] : ]
+     <td>a letter <code>'*'</code>|<code>'a'</code>|...|<code>'z'</code>|
+                  <code>'a'</code>|...|<code>'z'</code>
+ <tr><td>{ name [. type] \ }
+     <td>each one a subdirectory, <code>'\'</code> may be replaced by
+         <code>'/'</code>
+ <tr><td>[ name [. type] ]
+     <td>filename with type (extension)
+</table>
+
+<p>Name and type may be character sequences of any length (consisting of
+alphanumeric characters and <code>'-'</code>, <code>'_'</code>). They
+are shortened to 8 resp. 3 characters and converted to upper case. A
+single <code>'*'</code> is allowed for <code>:wild</code>.
+
+<!-- #endif -->
+<!-- #ifdef PATHNAME_AMIGAOS -->
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+<dd>
+see <a href="#pathnames-externally-amiga">above</a>.
+<!-- #endif -->
+<!-- #ifdef PATHNAME_UNIX -->
+<dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+<dd>
+<table>
+ <tr><td>[ / ]                 <td>/ denotes absolute pathnames
+ <tr><td>{ name / }            <td>each one a subdirectory
+ <tr><td>[ name [. type] ]     <td>filename with type (extension)
+</table>
+
+<p>Name and type may be character sequences of any length (consisting of
+printing ASCII characters, except <code>'/'</code>).
+
+<!-- #endif -->
+<!-- #if defined(PATHNAME_OS2) || defined(PATHNAME_WIN32) -->
+<dt><em>Platform dependent: <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd>
+<table>
+ <tr><td>[ [drivespec] : ]
+     <td>a letter '*'|'a'|...|'z'|'a'|...|'z'
+ <tr><td>{ name [. type] \ }
+     <td>each one a subdirectory, '\' may be replaced by '/'
+ <tr><td>[ name [. type] ]
+     <td>filename with type (extension)
+</table>
+
+<p>Name and type may be character sequences of any length (consisting of
+printing ASCII characters, except <code>'/'</code>, <code>'\'</code>,
+<code>':'</code>).
+
+<!-- #endif -->
+<!-- #ifdef PATHNAME_RISCOS -->
+<dt><em>Platform dependent: <strong>Acorn</strong> platforms only.</em>
+<dd>
+see <a href="#pathnames-externally-acorn">above</a>.
+<!-- #endif -->
+</dl>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_namestrin_h-namestring.html">
+<code>namestring</code></a> has an optional flag argument:
+<code>(namestring <var>pathname</var> t)</code> returns an external
+notation suitable for passing to the operating system or other programs.
+<!-- #if !defined(USER_HOMEDIR) -->
+
+<p><dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Amiga</strong> platforms only.</em>
+<dd>
+The function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_user-homedir-pathname.html">
+<code>user-homedir-pathname</code></a> is not implemented.
+<!-- #if defined(MSDOS) -->
+<dt><em>Platform dependent: <strong>DOS</strong>,
+    <strong>OS/2</strong> platforms only.</em>
+<dd>
+If you really need that function, you might define it like this:
+<pre><code>  (defun user-homedir-pathname (&amp;optional host)
+    (declare (ignore host))
+    (or (system::getenv "HOME") "\\")
+  )
+</code></pre>
+<!-- #endif -->
+</dl>
+<!-- #endif -->
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_19-3.html">
+    19.3 Logical Pathnames.</a></h3>
+
+<!-- #ifdef LOGICAL_PATHNAMES -->
+<p>When the argument of the function
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_translate_cal-pathname.html">
+<code>translate-logical-pathname</code></a> is a string, it is
+interpreted as a logical pathname string.
+<!-- #endif -->
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_filen_s_dictionary.html">
+    19.4 The Filenames Dictionary.</a></h3>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pathname-match-p.html">
+<code>pathname-match-p</code></a> does not interpret missing components
+as wild.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_translate-pathname.html">
+<code>translate-pathname</code></a> has two additional keywords:
+<br>  <code>(translate-pathname <var>source</var>
+      <var>from-wildname</var> <var>to-wildname</var> &amp;key :all
+      :merge)</code>
+
+<br>If <code>:all</code> is specified and
+non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, a list
+of all resulting pathnames, corresponding to all matches of <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_pathname-match-p.html">pathname-match-p</a>
+<var>source</var> <var>from-wildname</var>)</code>, is returned. If
+<code>:merge</code> is specified and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, unspecified pieces of <var>to-pathname</var> are
+not replaced by corresponding pieces of <var>source</var>.
+
+<br>This function seems to be buggy at this time.  Sorry.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_parse-namestring.html">
+    parse-namestring</a></h4>
+
+<p><code>(<a
+   href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_parse-namestring.html">parse-namestring</a>
+          <var>string</var> &amp;optional
+          <var>host</var> <var>defaults</var>)</code>
+returns a logical pathname only if host is a logical host or host is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> and defaults is a logical pathname.  To construct a
+logical pathname from a string, the function
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_logical-pathname.html">
+<code>logical-pathname</code></a> can be used.
+
+<a name="pathmerge"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_merge-pathnames.html">
+    merge-pathnames</a></h4>
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_merge-pathnames.html">merge-pathnames</a>
+          <var>pathname</var> [<var>default-pathname</var>])</code>
+returns a logical pathname only if <code>default-pathname</code> is a
+logical pathname. To construct a logical pathname from a string, the
+function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_logical-pathname.html">
+<code>logical-pathname</code></a> can be used.
+
+<p>When both <code>pathname</code> and <code>default-pathname</code> are
+relative pathnames, the behavior depends on
+<code><strong>lisp:*merge-pathnames-ansi*</strong></code>: when it is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, then CLISP retains its traditional behavior:
+<pre><code>(merge-pathnames #p"x/" #p"y/")
+             ==&gt; #p"x/"</code></pre>
+
+<p>Rationale: <code>merge-pathnames</code> is used to specify default
+components for pathnames, so there is some analogy between
+<code>(merge-pathnames a b)</code> and <code>(or a b)</code>. Obviously
+putting in the same default a second time should do the same as putting
+it in once: <code>(or a b b)</code> is the same as <code>(or a
+b)</code>, so <code>(merge-pathnames (merge-pathnames a b) b)</code>
+should be the same as <code>(merge-pathnames a b)</code>.
+
+<p>(This question actually matters because in Common Lisp there is no
+distinction between "pathnames with defaults merged-in" and "pathnames
+with defaults not yet applied".)
+
+<p>Now, <code>(merge-pathnames (merge-pathnames '#p"x/" '#p"y/")
+'#p"y/")</code> and <code>(merge-pathnames '#p"x/" '#p"y/")</code> are
+equal in CLISP (when <code>lisp:*merge-pathnames-ansi*</code> is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>), but not in implementations that strictly follow the
+Common Lisp spec. In fact, the above twice-default = once-default rule
+holds for all pathnames in CLISP.
+
+<p>When <code><strong>lisp:*merge-pathnames-ansi*</strong></code> is
+non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, the normal
+ANSI CL behavior is exhibited:
+<pre><code>(merge-pathnames #p"x/" #p"y/")
+             ==&gt; #p"y/x/"</code></pre>
+
+<p>The rationale is that "merge" is "merge" and not "or".
+
+<h2><a name="files"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-20.html">
+    Chapter 20: Files</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_files_dictionary.html">
+    20.2 The Files Dictionary.</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_rename-file.html">
+    rename-file</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_rename-file.html">
+<code>rename-file</code></a> always returns a non-logical pathname as
+its first value.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_probe-file.html">
+    probe-file</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_probe-file.html">
+<code>probe-file</code></a> can not be used to check whether a directory
+exists. Use the function <a
+href="#probe-dir"><code>lisp:probe-directory</code></a> or the
+function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_directory.html">
+<code>directory</code></a> for this purpose.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-author.html">
+    file-author</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-author.html">
+<code>file-author</code></a> always returns
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, because the operating systems CLISP is ported to
+do not store a file's author in the file system. Some operating systems,
+such as Unix, have the notion of a file's owner, and some other CL
+implementations return the user name of the file owner. CLISP does not
+do this, because <em>owner</em> and <em>author</em> are not the same; in
+particular, authorship is preserved by copying, while ownership is not.
+
+<a name="probe-dir"></a><h4>probe-directory</h4>
+
+<p><code>(<strong>lisp:probe-directory</strong>
+<var>pathname</var>)</code> tests whether <var>pathname</var> exists and
+is a directory. It will, unlike
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_probe-file.html">
+<code>probe-file</code></a> or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_truename.html">
+<code>truename</code></a>, not signal an error if the parent directory
+of <var>pathname</var> does not exist.
+
+<a name="dir"></a>
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_directory.html">
+    directory</a></h4>
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_directory.html">directory</a>
+           &amp;optional <var>pathname</var> &amp;key :full :circle)</code>
+  can run in two modes:
+<ul>
+ <li>If <var>pathname</var> contains no name or type component, a list
+  of all matching directories is produced.
+ <li>Otherwise a list of all matching files is returned. If the
+  <code>:full</code> argument is non-
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, this contains
+  additional information: for each matching file you get a list of at
+  least four elements <code>(<var>file-pathname</var>
+  <var>file-truename</var>
+  <var>file-write-date-as-decoded-time</var>
+  <var>file-length</var>)</code>.
+</ul>
+<!-- #ifdef UNIX -->
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+<dd>If the <code>:circle</code> argument is
+non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>,
+the function avoids endless loops that may result from symbolic links.
+</dl>
+<!-- #endif -->
+
+<p><code>(<strong>lisp:dir</strong> &amp;optional
+<var>pathname</var>)</code> is like <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_directory.html"> <code>directory</code></a>, but
+displays the pathnames instead of returning
+them. <code>(lisp:dir)</code> shows the contents of the current
+directory.
+
+<p><dl>
+<!-- #if defined(PATHNAME_UNIX) || defined(PATHNAME_AMIGAOS) -->
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>Amiga</strong> platforms only.</em>
+ <dd><code>(<strong>lisp:cd</strong> [<var>pathname</var>])</code>
+      manages the current directory.
+<!-- #elif defined(PATHNAME_RISCOS) -->
+ <dt><em>Platform dependent: <strong>Acorn</strong> platforms only.</em>
+  <dd><code>(<strong>lisp:cd</strong> [<var>pathname</var>])</code>
+  manages the current host, current device and the current directory.
+<!-- #else -->
+ <dt><em>Platform dependent: <strong>DOS</strong>,
+     <strong>OS/2</strong>, <strong>Win32</strong> platforms only.</em>
+  <dd><code>(<strong>lisp:cd</strong> [<var>pathname</var>])</code>
+  manages the current device and the current directory.
+<!-- #endif -->
+</dl>
+
+<p><code>(lisp:cd <var>pathname</var>)</code> sets it,
+<code>(lisp:cd)</code> returns it.
+
+<p><code>(<strong>lisp:default-directory</strong>)</code> is equivalent
+to <code>(cd)</code>.  <code>(setf (lisp:default-directory)
+<var>pathname</var>)</code> is equivalent to <code>(cd
+<var>pathname</var>)</code>, except for the return value.
+
+<p><code>(<strong>lisp:make-dir</strong>
+<var>directory-pathname</var>)</code> creates a new subdirectory.
+
+<p><code>(<strong>lisp:delete-dir</strong>
+<var>directory-pathname</var>)</code> removes an (empty) subdirectory.
+
+<h2><a name="streams"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-21.html">
+    Chapter 21: Streams</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_21-1-1-1-3.html">
+    21.1.1.1.3 Interactive Streams</a></h3>
+
+<p>Interactive streams are those whose next input might depend on a
+prompt one might output.
+
+<a name="terminal"></a><h3>terminal interaction.</h3>
+
+<!-- #ifdef GNU_READLINE -->
+<p><dl>
+ <dt><em>Platform dependent: <strong>UNIX</strong>,
+     <strong>DOS</strong>, <strong>OS/2</strong> platforms only, and
+     only in CLISP built <strong>without</strong> compile-time flag
+     <code><strong>NO_READLINE</strong></code>.</em>
+ <dd>Input through <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+  <code>*terminal-io*</code></a> uses the GNU readline
+  library. Arrow keys can be used to move within the input history. The
+  Tab key completes the symbol's name that is being typed.  See
+  <a href="clreadline.html">clreadline.html</a> or
+  <a href="clreadline.dvi">clreadline.dvi</a> for a complete
+  description of the key bindings.  The GNU readline library is not used
+  if standard input and standard output do not both refer to the same
+  terminal.
+</dl>
+<!-- #endif -->
+
+<!-- #if defined(KEYBOARD) || defined(AMIGAOS) -->
+<p><dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>, <strong>DOS</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong>,
+    <strong>Amiga</strong>, <strong>Acorn</strong> platforms only.</em>
+<dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+ <code>*terminal-io*</code></a> is not the only stream that communicates
+ directly with the user: During execution of the body of a
+ <code>(<strong>lisp:with-keyboard</strong> . <var>body</var>)</code> form,
+ <code><strong>lisp:*keyboard-input*</strong></code> is the stream that reads
+ the keystrokes from the keyboard. It returns every keystroke in detail,
+ as character or <code>sys::input-character</code> with the following bits:
+<dl>
+<!-- #if defined(MSDOS) || defined(WIN32) || defined(AMIGAOS) -->
+ <dt><code>:hyper</code>
+  <dd><em>(Platform dependent: <strong>DOS</strong>,
+      <strong>OS/2</strong>, <strong>Win32</strong>,
+      <strong>Amiga</strong> platforms only.)</em>
+      if a non-standard key. These are:
+<!-- #if defined(MSDOS) || defined(WIN32) -->
+     Function keys, cursor keypads, numeric keypad <em>(Platform
+     dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+     <strong>Win32</strong> platforms only)</em>.
+<!-- #endif -->
+<!-- #ifdef AMIGAOS -->
+     Function keys, cursor keypad <em>(Platform dependent:
+     <strong>Amiga</strong> platforms only)</em>.
+<!-- #endif -->
+
+<!-- #endif -->
+  <dt>slot <code>key</code>
+    <dd>the key name, for non-standard keys:
+
+      <dl>
+<!-- #ifdef MSDOS -->
+         <dt><em>Platform dependent: <strong>DOS</strong>,
+             <strong>OS/2</strong> platforms only.</em>
+          <dd> F1 -&gt; <code>:F1</code>, ..., F10 -&gt;
+           <code>:F10</code>, F11 -&gt; <code>:F11</code>, F12 -&gt;
+           <code>:F12</code>, Insert -&gt; <code>:Insert</code>,
+           Delete -&gt; <code>:Delete</code>, Home -&gt;
+           <code>:Home</code>, End -&gt; <code>:End</code>, PgUp -&gt;
+           <code>:PgUp</code>, PgDn -&gt; <code>:PgDn</code>, Arrow
+           keys -&gt; <code>:Up</code>, <code>:Down</code>,
+           <code>:Left</code>, <code>:Right</code>.
+<!-- #endif -->
+
+<!-- #if defined(UNIX) || defined(WIN32) -->
+         <dt><em>Platform dependent: <strong>UNIX</strong>,
+             <strong>Win32</strong> platforms only.</em>
+          <dd> F1 -&gt; <code>:F1</code>, ..., F10 -&gt;
+           <code>:F10</code>, F11 -&gt; <code>:F11</code>, F12 -&gt;
+           <code>:F12</code>, Insert -&gt; <code>:Insert</code>,
+           Delete -&gt; <code>:Delete</code>, Center -&gt;
+           <code>:Center</code>, Home -&gt; <code>:Home</code>, End
+           -&gt; <code>:End</code>, PgUp -&gt; <code>:PgUp</code>,
+           PgDn -&gt; <code>:PgDn</code>, Arrow keys -&gt;
+           <code>:Up</code>, <code>:Down</code>, <code>:Left</code>,
+           <code>:Right</code>.
+<!-- #endif -->
+
+<!-- #ifdef AMIGAOS -->
+         <dt><em>Platform dependent: <strong>Amiga</strong> platforms
+             only.</em>
+          <dd> F1 -&gt; <code>:F1</code>, ..., F9 -&gt;
+           <code>:F9</code>, F10 -&gt; <code>:F10</code>, Help -&gt;
+           <code>:Help</code>, Arrow keys -&gt; <code>:Up</code>,
+           <code>:Down</code>, <code>:Left</code>,
+           <code>:Right</code>.
+<!-- #endif -->
+      </dl>
+
+  <dt>slot <code>char</code>
+    <dd>the ASCII code for standard keys
+
+<!-- #if defined(MSDOS) || defined(WIN32) || defined(AMIGAOS) -->
+  <dt><code>:super</code>
+  <dd><em>(Platform dependent: <strong>DOS</strong>,
+      <strong>OS/2</strong>, <strong>Win32</strong>,
+      <strong>Amiga</strong> platforms only.)</em>
+  if pressed together with Shift key(s) and if the keystroke
+  would have been an other without Shift.
+<!-- #endif -->
+  <dt><code>:control</code> <dd>if pressed together with the Control key.
+<!-- #if defined(MSDOS) || defined(WIN32) -->
+  <dt><code>:meta</code>
+  <dd><em>(Platform dependent: <strong>DOS</strong>,
+      <strong>OS/2</strong>, <strong>Win32</strong> platforms only.)</em>
+  if pressed together with the Alternate key.
+<!-- #endif -->
+</dl>
+This keyboard input is not echoed on the screen.  During execution of a
+<code>(lisp:with-keyboard . <var>body</var>)</code> form, no input from
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+<code>*terminal-io*</code></a> or any synonymous stream should be requested.
+
+<!-- #ifdef TERMINAL_USES_KEYBOARD -->
+<!-- the stream <code>*keyboard-input*</code> is used by
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+     <code>*terminal-io*</code></a>. -->
+<!-- #endif -->
+</dl>
+<!-- #endif -->
+
+<h3>Printing and OS interface.</h3>
+
+<p>See also <a href="#shell"><code>(shell <var>command</var>)</code></a>.
+
+<p>The macro <code><strong>lisp:with-output-to-printer</strong></code>:<br>
+       <code>(lisp:with-output-to-printer (<var>var</var>
+         [<a href="#extfmt">:external-format</a>])
+         {<var>declaration</var>}* {<var>form</var>}*)</code>
+binds the variable <var>var</var> to an output stream that sends its
+output to the printer.
+
+<!-- #ifdef PIPES -->
+
+<p><a name="pipe"></a><dl>
+<dt><em>Platform dependent: <strong>UNIX</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong> platforms only.</em><dd>
+<dl><dt><code>(<strong>lisp:make-pipe-input-stream</strong>
+           <var>command</var> &amp;key
+           <a href="#eltype">:element-type</a>
+           <a href="#extfmt">:external-format</a>
+           <a href="#buffered">:buffered</a>)</code>
+<dd>returns an input stream that will supply the output from the
+execution of the given operating system command.
+
+<dt><code>(<strong>lisp:make-pipe-output-stream</strong>
+          <var>command</var> &amp;key
+          <a href="#eltype">:element-type</a>
+          <a href="#extfmt">:external-format</a>
+          <a href="#buffered">:buffered</a>)</code>
+<dd>returns an output stream that will pass its output as input to
+the execution of the given operating system command.
+
+<!-- #ifdef PIPES2 -->
+<dt><code>(<strong>lisp:make-pipe-io-stream</strong>
+          <var>command</var> &amp;key
+          <a href="#eltype">:element-type</a>
+          <a href="#extfmt">:external-format</a>
+          <a href="#buffered">:buffered</a>)</code>
+<dd>returns three values. The first value is a bidirectional stream that
+will simultaneously pass its output as input to the execution of the
+given operating system command and supply the output from this command
+as input. The second and third value will be the input stream and the
+output stream that make up the I/O stream, respectively.  Note that they
+must be closed individually.
+
+<br>Warning: Improper use of this function can lead to deadlocks. You
+use it at your own risk!
+
+<br>A deadlock occurs if the command and your program either both try to
+read from each other at the same time or both try to write to each other
+at the same time. To avoid deadlocks, it is recommended that you fix a
+protocol between the command and your program and avoid any hidden
+buffering: use <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char.html">
+<code>read-char</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char-no-hang.html">
+<code>read-char-no-hang</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_listen.html">
+<code>listen</code></a> instead of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-line.html">
+<code>read-line</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_readcm_re_g-whitespace.html">
+<code>read</code></a> on the input side, and complete every output
+operation by a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_finish-ou_clear-output.html">
+<code>finish-output</code></a>. The same cautions must apply to the
+called command as well.
+<!-- #endif -->
+</dl></dl>
+
+<p>For all functions that accept these keywords, the acceptable values are:
+<dl>
+ <dt><a name="eltype"><code>:element-type</code></a>
+  <dd>types equivalent to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+   <code>character</code></a> or
+   <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+   <var>n</var>)</code>,
+   <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+   <var>n</var>)</code>; if the
+   stream is to be unbuffered, <var>n</var> must be a multiple of 8.
+ <dt><a name="extfmt"><code>:external-format</code></a>
+  <dd>encodings, (constant) symbols in the <a
+   href="#encoding"><code>CHARSET</code></a> package, strings (denoting
+   <a href="#iconv">iconv()</a> based encodings), the symbol
+   <code>:default</code>, and the <a href="#newline">line terminator</a>
+   keywords <code>:unix</code>, <code>:mac</code>, <code>:dos</code>.
+   The default encoding is
+   <a href="#def-file-enc"><code>lisp:*default-file-encoding*</code></a>.
+ <dt><a name="buffered"><code>:buffered</code></a>
+  <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>,
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>,
+      or <code>:default</code>.
+  <ul>
+   <li>for functions that create <a href="#socket">sockets</a> and
+     <a href="#pipe">pipes</a>, <code>:default</code> is equivalent
+     to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>;
+    <li>for functions that <a href="#open">open</a> files,
+     <code>:default</code> means that buffered file streams will be
+     returned for regular files and (on Unix) block-devices, and
+     unbuffered file streams for special files.
+  </ul>
+</dl>
+
+<!-- #endif -->
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_streams_dictionary.html">
+    21.2. The Streams Dictionary</a></h3>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+    stream-element-type</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+<code>stream-element-type</code></a> is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_setfcm_psetf.html">
+<code>setf</code></a>able. The element type of streams created by the
+functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open.html">
+<code>open</code></a>,
+<a href="#pipe"><code>lisp:make-pipe-input-stream</code></a>,
+<a href="#pipe"><code>lisp:make-pipe-output-stream</code></a>,
+<a href="#pipe"><code>lisp:make-pipe-io-stream</code></a>,
+<a href="#socket"><code>lisp:socket-accept</code></a>,
+<a href="#socket"><code>lisp:socket-connect</code></a> can be modified,
+if the old and the new element type are either
+<ul>
+  <li>both equivalent to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+      <code>character</code></a> or
+      <code>(<a
+      href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+      8)</code> or <code>(<a
+      href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a> 8)</code>,
+      or
+  <li>both equivalent to <code>(<a
+      href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+      <var>n</var>)</code> or
+      <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+      <var>n</var>)</code>, with the same <var>n</var>.
+</ul>
+
+<h4>Binary input, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html">
+    read-byte</a></h4>
+
+<p>The function
+<code>(<strong>lisp:read-integer</strong> <var>stream</var>
+       <var>element-type</var> &amp;optional <var>endianness</var>
+       <var>eof-error-p</var> <var>eof-value</var>)</code>
+reads a multi-byte integer from <var>stream</var>.  <var>stream</var>
+should be a stream with element-type <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8)</code>.
+<var>element-type</var> should be a type equivalent to
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+<var>n</var>)</code>, where <var>n</var> is a multiple of 8.
+
+<p><code>(lisp:read-integer <var>stream</var> <var>element-type</var>)</code>
+is like <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html">read-byte</a>
+<var>stream</var>)</code> if <var>stream</var>'s element type were set
+to <var>element-type</var>, except that <var>stream</var>'s <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-position.html">file-position</a> will increase
+by <sup><var>n</var></sup>/<sub>8</sub> instead of 1.
+
+<p><var>endianness</var> can be <code>:little</code> or <code>:big</code>.
+The default is <code>:little</code>, which corresponds to the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html"><code>read-byte</code></a>
+behavior in CLISP.
+
+<p>Together with <code>(setf <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+stream-element-type</a>)</code>, this function permits mixed
+character/binary input from a stream.
+
+<p>The function
+<code>(<strong>lisp:read-float</strong> <var>stream</var>
+       <var>element-type</var> &amp;optional <var>endianness</var>
+       <var>eof-error-p</var> <var>eof-value</var>)</code>
+reads a floating-point number in IEEE binary representation from
+<var>stream</var>.  <var>stream</var> should be a stream with element-type
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8)</code>.
+<var>element-type</var> should be a type equivalent to
+<code><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">single-float</a></code>
+or
+<code><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">double-float</a></code>.
+
+<p><var>endianness</var> can be <code>:little</code> or <code>:big</code>.
+The default is <code>:little</code>, which corresponds to the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html"><code>read-byte</code></a>
+behavior in CLISP.
+
+<h4>Binary output, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-byte.html">
+    write-byte</a></h4>
+
+<p>The function
+<code>(<strong>lisp:write-integer</strong> <var>integer</var>
+       <var>stream</var> <var>element-type</var>
+       &amp;optional <var>endianness</var>)</code>
+writes a multi-byte integer to <var>stream</var>.  <var>stream</var>
+should be a stream with element-type <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8)</code>.
+<var>element-type</var> should be a type equivalent to
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+<var>n</var>)</code>, where <var>n</var> is a multiple of 8.
+
+<p><code>(lisp:write-integer <var>integer</var> <var>stream</var>
+          <var>element-type</var>)</code>
+is like <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-byte.html">write-byte</a>
+<var>integer</var> <var>stream</var>)</code> if <var>stream</var>'s element
+type were set to <var>element-type</var>, except that <var>stream</var>'s
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-position.html">file-position</a> will
+increase by <sup><var>n</var></sup>/<sub>8</sub> instead of 1.
+
+<p><var>endianness</var> can be <code>:little</code> or <code>:big</code>.
+The default is <code>:little</code>, which corresponds to the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-byte.html"><code>write-byte</code></a>
+behaviour in CLISP.
+
+<p>Together with <code>(setf <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+stream-element-type</a>)</code>, this function
+permits mixed character/binary output to a stream.
+
+<p>The function
+<code>(<strong>lisp:write-float</strong> <var>float</var>
+       <var>stream</var> <var>element-type</var>
+       &amp;optional <var>endianness</var>)</code>
+writes a floating-point number in IEEE binary representation to
+<var>stream</var>.  <var>stream</var> should be a stream with element-type
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8)</code>.
+<var>element-type</var> should be a type equivalent to
+<code><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">single-float</a></code>
+or
+<code><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">double-float</a></code>.
+
+<p><var>endianness</var> can be <code>:little</code> or <code>:big</code>.
+The default is <code>:little</code>, which corresponds to the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-byte.html"><code>write-byte</code></a>
+behaviour in CLISP.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-sequence.html">
+    read-sequence</a></h4>
+
+<p>In addition to <code>read-sequence</code>, the following two
+functions are provided:
+
+<dl>
+ <dt><code><strong>lisp:read-byte-sequence</strong></code>
+ performs multiple <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html">
+ <code>read-byte</code></a> operations:
+
+ <dd><code>(lisp:read-byte-sequence <var>sequence</var> <var>stream</var>
+&amp;key :start :end)</code> fills the subsequence of <var>sequence</var>
+specified by <var><code>:start</code></var> and
+<var><code>:end</code></var> with integers consecutively read from
+<var>stream</var>. It returns the index of the first element of
+<var>sequence</var> that was not updated (= <var>end</var> or &lt;
+<var>end</var> if the stream reached its end).
+
+<p>This function is especially efficient if <var>sequence</var> is a
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html">vector</a> (<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8))</code> and
+<var>stream</var> is a <a href="#open">file</a>/<a
+href="#pipe">pipe</a>/<a href="#socket">socket</a> stream with element
+type <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+8)</code>.
+
+ <p><dt><code><strong>lisp:read-char-sequence</strong></code>
+ performs multiple <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char.html">
+ <code>read-char</code></a> operations:
+
+ <dd><code>(read-char-sequence <var>sequence</var> <var>stream</var>
+&amp;key :start :end)</code> fills the subsequence of <var>sequence</var>
+specified by <var><code>:start</code></var> and
+<var><code>:end</code></var> with characters consecutively read from
+<var>stream</var>. It returns the index of the first element of
+<var>sequence</var> that was not updated (= <var>end</var> or &lt;
+<var>end</var> if the stream reached its end).
+
+<p>This function is especially efficient if <var>sequence</var> is a
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> and <var>stream</var> is a
+<a href="#open">file</a>/<a href="#pipe">pipe</a>/<a href="#socket">socket</a>
+stream with element type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+<code>character</code></a> or an
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_i.html#input">
+input</a> <a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_s.html#string_stream">
+string stream</a>.
+</dl>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-sequence.html">
+    write-sequence</a></h4>
+
+<p>In addition to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-sequence.html">
+<code>write-sequence</code></a>, the following two
+functions are provided:
+
+<dl>
+ <dt><code><strong>lisp:write-byte-sequence</strong></code>
+ performs multiple <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-byte.html">
+ <code>write-byte</code></a> operations:
+
+ <dd><code>(lisp:write-byte-sequence <var>sequence</var> <var>stream</var>
+&amp;key :start :end)</code> outputs the integers of the subsequence
+of <var>sequence</var> specified by <var><code>:start</code></var> and
+<var><code>:end</code></var> to <var>stream</var>. It returns
+<var>sequence</var>.
+
+<p>This function is especially efficient if <var>sequence</var> is a
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html">vector</a> (<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a> 8))</code> and
+<var>stream</var> is a <a href="#open">file</a>/<a
+href="#pipe">pipe</a>/<a href="#socket">socket</a> stream with element
+type <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+8)</code>.
+
+ <p><dt><code><strong>lisp:write-char-sequence</strong></code>
+ performs multiple <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-char.html">
+ <code>write-char</code></a> operations:
+
+ <dd><code>(lisp:write-char-sequence <var>sequence</var> <var>stream</var>
+&amp;key :start :end)</code> outputs the characters of the
+subsequence of <var>sequence</var> specified by
+<var><code>:start</code></var> and <var><code>:end</code></var> to
+<var>stream</var>.  It returns <var>sequence</var>.
+
+<p>This function is especially efficient if <var>sequence</var> is a
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> and <var>stream</var> is a
+<a href="#open">file</a>/<a href="#pipe">pipe</a>/<a href="#socket">socket</a>
+stream with element type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+<code>character</code></a>.
+</dl>
+
+<!-- #if defined(MSDOS) || defined(WIN32) || (defined(UNIX) && (O_BINARY != 0)) -->
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-position.html">
+    file-position</a></h4>
+
+<dl>
+ <dt><em>Platform dependent: <strong>DOS</strong>,
+     <strong>OS/2</strong>, <strong>Win32</strong> platforms only.</em>
+  <dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_file-position.html">
+  <code>file-position</code></a> works on any buffered file stream. When
+  a Newline is output to resp. input from a file stream, its file
+  position is increased by 2 since Newline is encoded as CR/LF in the file.
+</dl>
+<!-- #endif -->
+
+<a name="open"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open.html">
+    open</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open.html">
+<code>open</code></a> cannot handle files of size &gt;= 4 GB.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open.html">
+<code>open</code></a> accepts three additional keywords:
+<a href="#extfmt"><code>:external-format</code></a>,
+<a href="#eltype"><code>:element-type</code></a>, and
+<a href="#buffered"><code>:buffered</code></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_close.html">
+    close</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_close.html">
+<code>close</code></a> ignores its <code>:abort</code> argument.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_broadcast-stream.html">
+    broadcast-stream</a></h4>
+
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_input-str_put-stream-p.html">
+<code>input-stream-p</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_interactive-stream-p.html">
+<code>interactive-stream-p</code></a> return false for
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_b.html#broadcast_stream">broadcast streams</a>.
+
+<h2><a name="printer"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-22.html">
+    Chapter 22: Printer</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-1-1-1.html">
+    22.1.1.1 Multiple Possible Textual Representations</a></h3>
+
+<a name="pr-closure"></a>
+<p>An additional variable
+<code><strong>lisp:*print-closure*</strong></code> controls whether
+compiled and interpreted functions (closures) are output in detailed
+form.  If <code>lisp:*print-closure*</code> is
+non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, compiled
+closures are output in <code>#Y</code> syntax which the reader
+understands.  <code>lisp:*print-closure*</code> is initially set to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+
+<a name="pr-rpars"></a>
+<p>An additional variable
+<code><strong>lisp:*print-rpars*</strong></code> controls the output of
+the right (closing) parentheses. If <code>lisp:*print-rpars*</code> is
+non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, closing
+parentheses which do not fit onto the same line as the the corresponding
+opening parenthesis are output just below their corresponding opening
+parenthesis, in the same column.  <code>lisp:*print-rpars*</code> is
+initially set to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+
+<a name="pr-indent"></a>
+<p>An additional variable
+<code><strong>lisp:*print-indent-lists*</strong></code> controls the
+indentation of lists that span more than one line. It specifies by how
+many characters items within the list will be indented relative to the
+beginning of the list.  <code>lisp:*print-indent-lists*</code> is
+initially set to <code>2</code>.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-1-3-7.html">
+    22.1.3.7 Printing Other Vectors</a></h3>
+
+When <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true, other vectors are written as
+follows: If the element-type is <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_t.html"><code>t</code></a>, the syntax
+<code>#(<var>x<sub>0</sub></var> ... <var>x<sub>n-1</sub></var>)</code>
+is used. Otherwise, the syntax <code>#A(<var>element-type</var>
+<var>dimensions</var> <var>contents</var>)</code> is used.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-1-3-8.html">
+    22.1.3.8 Printing Other Arrays</a></h3>
+
+When <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true, other arrays are written as
+follows: If the element-type is <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_t.html"><code>t</code></a>, the syntax
+<code>#<var>rank</var>A <var>contents</var></code> is used. Otherwise,
+the syntax <code>#A(<var>element-type</var> <var>dimensions</var>
+<var>contents</var>)</code> is used.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-2-1-3.html">
+    22.2.1.3 Compiling Format Strings</a></h3>
+
+<p>The functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>write</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_write-to-_nc-to-string.html">
+<code>write-to-string</code></a> have an additional keyword
+<code>:closure</code> that can be used to bind
+<a href="#pr-closure"><code>lisp:*print-closure*</code></a>.
+
+<h2><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_printer_dictionary.html">
+    22.4 The Printer Dictionary</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+    format</a></h3>
+
+<p>The <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a> instruction
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-3.html"><code>~W</code></a> is similar to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-1.html"><code>~A</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-4-2.html"><code>~S</code></a>,
+but avoids binding of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-escapest.html">
+<code>*print-escape*</code></a>.
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">format</a> <var>stream</var>
+"~W" <var>object</var>)</code> is equivalent to
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">write</a>
+<var>object</var> :stream <var>stream</var>)</code>.
+
+<p>The <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a> instruction <code><strong>~!</strong></code> is
+similar to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-5-4.html">
+<code>~/</code></a>, but avoids putting a function name into a string.
+Thus, even if the function is not interned in the <a
+href="#clupack"><code>COMMON-LISP-USER</code></a> package, you might not
+need to specify the package.
+
+<p><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">format</a>
+<var>stream</var> "~args!" <var>function</var>
+<var>object</var>)</code> is equivalent to
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_funcall.html">funcall</a>
+<var>function</var> <var>stream</var> <var>object</var>
+<var>colon-modifier-p</var> <var>atsign-modifier-p</var>
+<var>args</var>)</code>.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-1.html"><code>~R</code></a>
+and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-2-1.html"><code>~:R</code></a>
+can output only integers in the range <code>|n| &lt;
+10<sup>66</sup></code>.  The output is in English, according to the
+American conventions, and these conventions are identical to the British
+conventions only in the range <code>|n| &lt; 10<sup>9</sup></code>.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-1-1.html"><code>~:@C</code></a>
+does not output the character itself, only
+the instruction how to type the character.
+
+<p>For <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-2.html"><code>~E</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-3.html"><code>~G</code></a>, the value of
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stread-de_oat-formatst.html">
+<code>*read-default-float-format*</code></a> does not matter if
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_format.html">
+<code>format</code></a>
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-6-1.html"><code>~T</code></a>
+can determine the current column of any built-in stream.
+
+<a name="pathprint"></a><h3>pathnames</h3>
+
+<p>Pathnames are printed as follows: If
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-escapest.html">
+<code>*print-escape*</code></a> is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, only the namestring
+is printed; otherwise it is printed with <code>#P""</code> syntax, as
+per ANSI CL Issue <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss276.html">
+PRINT-READABLY-BEHAVIOR:CLARIFY</a>.  But, if
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true, we are in trouble as
+<code>#P""</code> is ambiguous (which is verboten when
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true), while being mandated by the
+ANSI CL standard.  Therefore, in this case, we print it like this
+
+<pre><code>#-CLISP #P"" #+CLISP #S(PATHNAME ...)</code></pre>
+
+<p>When the variable
+<code><strong>lisp:*print-pathnames-ansi*</strong></code> is not set,
+otherwise the <code>#P""</code> notation is used as per <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_1-5-1-4.html">1.5.1.4.1 Resolution of Apparent
+Conflicts in Exceptional Situations</a>.
+
+<h3>misc</h3>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-casest.html">
+<code>*print-case*</code></a> controls the output not only of symbols,
+but also of characters and some <code>#&lt;...&gt;</code> objects.
+
+<p>In the absence of <code><strong>sys::write-float-decimal</strong></code>,
+floating point numbers are output in radix 2.  This function is defined
+in <code>floatpri.lsp</code> and is not available if you run CLISP
+without a memory image.
+
+<p>If <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+<code>*print-readably*</code></a> is true,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stread-de_oat-formatst.html">
+<code>*read-default-float-format*</code></a> has no influence on the way
+floating point numbers are printed.
+
+<p><dl>
+<!-- #ifndef AMIGAOS -->
+<dt><em>Platform dependent: <strong>UNIX</strong>, <strong>DOS</strong>,
+    <strong>OS/2</strong>, <strong>Win32</strong>, <strong>Acorn</strong>
+    platforms only.</em>
+<dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-prettyst.html">
+<code>*print-pretty*</code></a> is initially
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> but set to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> in <code>config.lsp</code>. This makes screen output
+prettier.
+<!-- #else -->
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+<dd><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-prettyst.html">
+<code>*print-pretty*</code></a> is initially
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> but set to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> in <code>config.lsp</code>. This makes unbuffered screen
+output much faster.
+<!-- #endif -->
+</dl>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-arrayst.html">
+<code>*print-array*</code></a> is initially set to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+
+<h2><a name="reader"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-23.html">
+    Chapter 23: Reader</a></h2>
+
+<p>This is the list of objects whose external representation can not be
+meaningfully read in:
+<table>
+  <tr> <td valign=top> <code>#&lt;<var>type</var> ...&gt;</code>
+       <td> all structures lacking a keyword constructor
+  <tr> <td valign=top> <code>#&lt;ARRAY <var>type</var>
+       <var>dimensions</var>&gt;</code>
+       <td> all arrays except strings, if
+            <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-arrayst.html">
+            <code>*print-array*</code></a> is
+            <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr> <td valign=top> <code>#&lt;SYSTEM-FUNCTION <var>name</var>&gt;</code>
+       <td> built-in function written in C
+  <tr> <td valign=top> <code>#&lt;ADD-ON-SYSTEM-FUNCTION
+       <var>name</var>&gt;</code>
+       <td> other function written in C
+  <tr> <td valign=top> <code>#&lt;SPECIAL-OPERATOR
+       <var>name</var>&gt;</code>
+       <td> special operator handler
+  <tr> <td valign=top> <code>#&lt;COMPILED-CLOSURE <var>name</var>&gt;</code>
+       <td> compiled function, if <a
+       href="#pr-closure"><code>lisp:*print-closure*</code></a> is
+       <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+  <tr> <td valign=top> <code>#&lt;CLOSURE <var>name</var> ...&gt;</code>
+       <td> interpreted function
+  <tr> <td valign=top> <code>#&lt;FRAME-POINTER #x...&gt;</code>
+       <td> pointer to a stack frame
+  <tr> <td valign=top> <code>#&lt;DISABLED POINTER&gt;</code>
+       <td> frame pointer which has become invalid on
+            exit from the corresponding <code>block</code> or
+            <code>tagbody</code>
+  <tr> <td valign=top> <code>#&lt;...-STREAM ...&gt;</code>
+       <td> stream
+  <tr> <td valign=top> <code>#&lt;PACKAGE <var>name</var>&gt;</code>
+       <td> package
+  <tr> <td valign=top> <code>#&lt;HASH-TABLE #x...&gt;</code>
+       <td> hash table, if <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-arrayst.html">
+            <code>*print-array*</code></a> is
+            <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+            <code>nil</code></a>
+  <tr> <td valign=top> <code>#&lt;READTABLE #x...&gt;</code>
+       <td> readtable
+  <tr> <td valign=top> <code>#&lt;SYMBOL-MACRO <var>form</var>&gt;</code>
+       <td> symbol-macro handler
+<!-- #ifdef FOREIGN -->
+  <tr> <td valign=top> <code>#&lt;FOREIGN-POINTER #x...&gt;</code>
+       <td> foreign pointer
+            <br><em>(Platform dependent: <strong>UNIX</strong>,
+                <strong>Win32</strong>, <strong>Amiga</strong>
+                platforms only.)</em>
+<!-- #endif -->
+<!-- #ifdef DYNAMIC_FFI -->
+  <tr> <td valign=top> <code>#&lt;FOREIGN-ADDRESS #x...&gt;</code>
+       <td> foreign address
+            <br><em>(Platform dependent: <strong>UNIX</strong>,
+                <strong>Win32</strong> platforms only.)</em>
+  <tr> <td valign=top> <code>#&lt;FOREIGN-VARIABLE <var>name</var> #x...&gt;</code>
+       <td> foreign variable
+            <br><em>(Platform dependent: <strong>UNIX</strong>,
+                <strong>Win32</strong> platforms only.)</em>
+  <tr> <td valign=top> <code>#&lt;FOREIGN-FUNCTION <var>name</var> #x...&gt;</code>
+       <td> foreign function
+            <br><em>(Platform dependent: <strong>UNIX</strong>,
+                <strong>Win32</strong> platforms only.)</em>
+<!-- #endif -->
+  <tr> <td valign=top> <code>#&lt;UNBOUND&gt;</code>
+       <td> "value" of a symbol without value, "value"
+            of an unsupplied optional or keyword argument
+  <tr> <td valign=top> <code>#&lt;SPECIAL REFERENCE&gt;</code>
+       <td> environment marker for variables declared <code>special</code>
+  <tr> <td valign=top> <code>#&lt;DOT&gt;</code>
+       <td> internal <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_readcm_re_g-whitespace.html">
+            <code>read</code></a> result for "."
+  <tr> <td valign=top> <code>#&lt;END OF FILE&gt;</code>
+       <td> internal <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_readcm_re_g-whitespace.html">
+            <code>read</code></a> result, when the end of file is reached
+  <tr> <td valign=top> <code>#&lt;READ-LABEL ...&gt;</code>
+       <td> intermediate <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_readcm_re_g-whitespace.html">
+            <code>read</code></a> result for #n#
+  <tr> <td valign=top> <code>#&lt;ADDRESS #x...&gt;</code>
+       <td> machine address, should not occur
+  <tr> <td valign=top> <code>#&lt;SYSTEM-POINTER #x...&gt;</code>
+       <td> should not occur
+</table>
+
+<a name="chario"></a><h3>characters</h3>
+
+<p><code>#\</code> allows inputting characters of arbitrary code:
+<code>#\Code231</code> yields the character
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_code-char.html">code-char</a> 231.)</code>.
+
+<h3>Additional read dispatch macros</h3>
+
+<ul>
+<li><code>#Y</code> is used to read compiled functions and to set the
+     current input stream's encoding.
+<li><code>#""</code> is used to read pathnames: <code>#"test.lsp"</code>
+     is the value of <code>(pathname "test.lsp")</code>
+<dl>
+<!-- #if defined(MSDOS) -->
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Win32</strong> platforms only.</em>
+<dd> As in all strings, backslashes must be written twice here:
+     <code>#"A:\\programs\\test.lsp"</code>
+<!-- #endif -->
+
+<!-- #ifdef RISCOS -->
+<dt><em>Platform dependent: <strong>Acorn</strong> platforms only.</em>
+<dd> As in all strings, backslashes must be written twice here:
+     <code>#"\\.test.lsp"</code>
+<!-- #endif -->
+</dl>
+</ul>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/acc_readtable-case.html">
+    readtable-case</a></h3>
+
+<p>When the value of <code>(readtable-case <var>readtable</var>)</code>
+is <code>:invert</code>, it applies to the package name and the symbol
+name of a symbol separately (not to the entire token at once).  An
+alternative to the use of <code>readtable-case</code> is the use of the
+<code>:case-sensitive</code> option to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_make-package.html">
+<code>make-package</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_in-package.html">
+<code>in-package</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defpackage.html">
+<code>defpackage</code></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_listen.html">
+    listen</a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char-no-hang.html">
+    read-char-no-hang</a></h4>
+
+<dl>
+  <dt> <code>(<strong>lisp:read-char-will-hang-p</strong>
+              <var>stream</var>)</code>
+  <dd> <code>lisp:read-char-will-hang-p</code> queries the stream's input
+    status. It returns
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> if
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char.html"><code>read-char</code></a> and
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_peek-char.html"><code>peek-char</code></a> with
+    a peek-type of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+    will return immediately. Otherwise it returns true.
+    <p>
+    Note the difference with the standard
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_listen.html"><code>listen</code></a> function:
+    When the end-of-stream is reached, <code>listen</code> returns
+    <code>nil</code>, whereas <code>lisp:read-char-will-hang-p</code> returns
+    true.
+    <p>
+    Note also that <code>lisp:read-char-will-hang-p</code> is not a good mean
+    to test for end-of-stream: If <code>lisp:read-char-will-hang-p</code>
+    returns <code>t</code>, this does not mean that the stream will deliver
+    more characters. It only means that it is not known at this moment
+    whether the stream is already at end-of-stream, or will deliver more
+    characters.
+</dl>
+
+<h2><a name="system"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-24.html">
+    Chapter 24: System Construction</a></h2>
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_syste_n_dictionary.html">
+    24.2: The System Construction Dictionary</a></h3>
+
+<p>The compiler can be called not only by the functions
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile.html">
+<code>compile</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile-file.html">
+<code>compile-file</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_disassemble.html">
+<code>disassemble</code></a>, but also by the declaration
+<code>(compile)</code>.
+
+<a name="compilefile"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile-file.html">
+    compile-file</a></h4>
+
+<p><code>(compile-file <var>input-file</var> &amp;key :output-file
+          :listing :warnings :verbose :print)</code>
+compiles a file to platform-independent bytecode.
+
+<dl>
+<dt><var>input-file</var>
+ <dd>should be a pathname/string/symbol.
+<dt><code>:output-file</code>
+ <dd>should be <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+ <code>t</code></a> or a pathname/string/symbol or an output-stream.
+ The default is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+ <code>t</code></a>.
+<dt><code>:listing</code>
+ <dd>should be <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+ <code>t</code></a> or a pathname/string/symbol or an output-stream.
+ The default is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+ <code>nil</code></a>.
+<dt><code>:warnings</code>
+ <dd>specifies whether warnings should also appear on the screen.
+<dt><code>:verbose</code>
+ <dd>specifies whether error messages should also appear on the screen.
+<dt><code>:print</code>
+ <dd>specifies whether an indication which forms are being compiled
+ should appear on the screen.
+</dl>
+
+<p>The variables <code><strong>lisp:*compile-warnings*</strong></code>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stcompile_le-verbosest.html">
+<code>*compile-verbose*</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stcompile_le-verbosest.html">
+<code>*compile-print*</code></a> provide
+defaults for the <code>:warnings</code>, <code>:verbose</code>,
+<code>:print</code> keyword arguments, respectively.  For each input
+file (default file type: <code>#p".lsp"</code>) the following
+files are generated:
+
+<p><table border=1>
+  <tr><th>File <th>When <th>Default file type  <th>Contents
+  <tr><td>output file
+      <td>only if <code>:output-file</code> is not
+          <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>#p".fas"</code>
+      <td>can be loaded using the <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+          <code>load</code></a> function.
+  <tr><td>auxiliary output file
+      <td>only if <code>:output-file</code> is not
+          <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>#p".lib"</code>
+      <td>used by <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile-file.html">
+          <code>compile-file</code></a> when compiling
+          a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_providecm_require.html">
+          <code>require</code></a> form referring to the input file.
+  <tr><td>listing file
+      <td>only if <code>:listing</code> is not
+          <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>#p".lis"</code>
+      <td>disassembly of the output file.
+  <tr><td>C output file
+      <td>only if <code>:output-file</code> is not
+          <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      <td><code>#p".c"</code>
+      <td>foreign function interface; this file is deleted if it is empty.
+</table>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile-file-pathname.html">
+    compile-file-pathname</a></h4>
+
+The default for the <code>:output-file</code> argument is
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>,
+which means <code>#p".fas"</code>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_providecm_require.html">
+    require</a></h4>
+
+<p>The function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_providecm_require.html">
+<code>require</code></a> receives as optional argument
+either a pathname or a list of pathnames: files to be loaded if the
+required module is not already in memory.
+
+<a name="loadfile"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+    load</a></h4>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+<code>load</code></a> has two additional keywords <code>:echo</code> and
+<code>:compiling</code>.
+
+<p><code>(load <var>filename</var> &amp;key :verbose :print :echo
+ :if-does-not-exist :compiling)</code>
+
+<dl>
+ <dt><code>:verbose t</code>
+  <dd>causes <code>load</code> to emit a short message that a file is
+  being loaded. The default is
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stload-pr_ad-verbosest.html">
+  <code>*load-verbose*</code></a>, which is
+  initially <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+ <dt><code>:print t</code>
+  <dd>causes <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+  <code>load</code></a> to print the value of each form. The
+  default is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stload-pr_ad-verbosest.html">
+  <code>*load-print*</code></a>, which is initially
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+ <dt><code>:echo t</code>
+  <dd>causes the input from the file to be echoed to
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+  <code>*standard-output*</code></a> (normally to the screen). Should
+  there be an error in the file, you can see at one glance where it is.
+  The default is <code><strong>lisp:*load-echo*</strong></code>, which is
+  initially <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+ <dt><code>:compiling t</code>
+  <dd>causes each form read to be compiled on the fly. The compiled code
+  is executed at once and - in contrast to <a
+  href="#compilefile"><code>compile-file</code></a> - not written to a
+  file. The default is
+  <code><strong>lisp:*load-compiling*</strong></code>,
+  which is initially <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+  <code>nil</code></a>.
+</dl>
+
+<p>The variable <code><strong>lisp:*load-paths*</strong></code> contains
+a list of directories where program files are searched - additionally to
+the specified or current directory - by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+<code>load</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_providecm_require.html">
+<code>require</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_compile-file.html">
+<code>compile-file</code></a>.
+
+<a name="features"></a>
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stfeaturesst.html">*features*</a></h4>
+
+<p>The variable <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stfeaturesst.html">
+<code>*features*</code></a> initially contains the symbols
+<table border=1>
+ <tr><th align=left><code>:CLISP</code>
+     <td> the name of this implementation
+ <tr><th align=left><code>:ANSI-CL</code>
+     <td> if invoked with <a href="clisp.html#Option -a"><code>-a</code></a>
+     <a href="clisp.html">command line option.</a>
+ <tr><th align=left><code>:COMMON-LISP</code>
+ <tr><th align=left><code>:CLTL2</code>
+ <tr><th align=left><code>:INTERPRETER</code>
+ <tr><th align=left><code>:COMPILER</code>
+<!-- #ifdef LOGICAL_PATHNAMES -->
+ <tr><th align=left><code>:LOGICAL-PATHNAMES</code>
+<!-- #endif -->
+<!-- #ifdef DYNAMIC_FFI -->
+ <tr><th align=left><code>:FFI</code>
+     <td> if a foreign function interface is supported <em>(Platform
+     dependent: many UNIX, Win32 platforms only)</em>
+<!-- #endif -->
+<!-- #ifdef GNU_GETTEXT -->
+ <tr><th align=left><code>:GETTEXT</code>
+     <td> if internationalization using the GNU gettext package is
+     supported <em>(Platform dependent: most <strong>UNIX</strong>
+     platforms only)</em>
+<!-- #endif -->
+<!-- #ifdef UNICODE -->
+ <tr><th align=left><code>:UNICODE</code>
+     <td> if Unicode (ISO 10646) characters are supported
+<!-- #endif -->
+ <tr><th align=left><code>:LOOP</code>
+ <tr><th align=left><code>:CLOS</code>
+ <tr><th align=left><code>:AMIGA</code>
+     <td> if <var>hardware</var> = Amiga and
+     <var>operating system</var> = Exec/AmigaDOS
+ <tr><th align=left><code>:DOS</code>
+     <td> if <var>hardware</var> = PC (clone) and
+     <var>operating system</var> = DOS
+ <tr><th align=left><code>:OS/2</code>
+     <td> if <var>hardware</var> = PC (clone) and
+     <var>operating system</var> = OS/2
+ <tr><th align=left><code>:WIN32</code>
+     <td> if <var>hardware</var> = PC (clone) and
+     <var>operating system</var> = Win32 (Windows 95/98/NT)
+ <tr><th align=left><code>:PC386</code>
+     <td> if <var>hardware</var> = PC (clone) with a 386/486/586/686 CPU
+ <tr><th align=left><code>:UNIX</code>
+     <td> if <var>operating system</var> = Unix
+     (yes, in this case the hardware is irrelevant!)
+</table>
+
+
+<h2><a name="environment"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-25.html">
+    Chapter 25: Environment</a></h2>
+
+<h3><a name="debugger"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_25-1-2.html">
+    25.1.2 Debugging Utilities</a></h3>
+
+<p>The debugger may be invoked through the functions
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_invoke-debugger.html">
+<code>invoke-debugger</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_break.html">
+<code>break</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_signal.html">
+<code>signal</code></a>,
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_error.html">
+<code>error</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_cerror.html">
+<code>cerror</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_warn.html">
+<code>warn</code></a>. The stepper is invoked through the macro
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_step.html">
+<code>step</code></a>.  Debugger and stepper execute subordinate <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_25-1-1.html">read-eval-print loops</a> (called
+"break loops") which are similar to the main <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_25-1-1.html">read-eval-print loop</a> except for
+the prompt and the set of available commands. Commands must be typed
+literally, without surrounding quotes or white space.
+
+<p>Commands common to the main loop, the debugger and the stepper:
+<table border=1>
+ <tr>  <th align=left width=100><code>Help</code>
+  <td>prints a list of available commands.
+</table>
+
+<p>Commands common to the debugger and the stepper:
+<table border=1>
+ <tr>  <th align=left width=100><code>Abort</code>
+  <td>abort to the next most recent
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_25-1-1.html">read-eval-print loop</a>.
+ <tr>  <th align=left width=100><code>Unwind</code>
+  <td>abort to the next most recent
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_25-1-1.html">read-eval-print loop</a>.
+</table>
+
+<p>The stack is organized into frames and other stack elements. Usually
+every invocation of an interpreted function and every evaluation of an
+interpreted form corresponds to one stack frame. Special forms such as
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_letcm_letst.html">
+<code>let</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_letcm_letst.html">
+<code>let*</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_unwind-protect.html">
+<code>unwind-protect</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_catch.html">
+<code>catch</code></a> produce special kinds of stack frames.
+
+<p>In a break loop there is a current stack frame, which is initially
+the most recent stack frame but can be moved using the debugger commands
+<code>Up</code> and <code>Down</code>.
+
+<p>Evaluation of forms in a break loop occurs in the lexical environment
+of the current stack frame but in the dynamic environment of the
+debugger's caller.  This means that to inspect or modify a lexical
+variable all you have to do is to move to the current stack frame just
+below the frame that corresponds to the form or the function call that
+binds that variable.
+
+<p>There is a current "stack mode" which defines in how much
+detail the stack is shown by the stack related debugger commands.
+
+<p>Commands common to the debugger and the stepper:
+<table border=1>
+ <tr><th align=left width=100><code>Mode-1</code>
+     <td>sets the current mode to 1: all the stack elements are
+         considered. This mode is fine for debugging compiled functions.
+ <tr><th align=left width=100><code>Mode-2</code>
+     <td>sets the current mode to 2: all the frames are considered.
+ <tr><th align=left width=100><code>Mode-3</code>
+     <td>sets the current mode to 3: only lexical frames (frames that
+         correspond to special forms that modify the lexical environment)
+         are considered.
+ <tr><th align=left width=100><code>Mode-4</code>
+     <td>sets the current mode to 4 (the default): only <code>eval</code>
+         and <code>apply</code> frames are considered. Every evaluation
+         of a form in the interpreter corresponds to an EVAL frame.
+ <tr><th align=left width=100><code>Mode-5</code>
+     <td>sets the current mode to 5: only <code>apply</code> frames are
+         considered. Every invocation of an interpreted function
+         corresponds to one <code>apply</code> frame.
+ <tr><th align=left width=100><code>Where</code>
+     <td>shows the current stack frame.
+ <tr><th align=left width=100><code>Up</code>
+     <td>goes up one frame, i.e., to the caller if in mode-5
+ <tr><th align=left width=100><code>Down</code>
+     <td>does down one frame, i.e., to the callee if in mode-5
+ <tr><th align=left width=100><code>Top</code>
+     <td>goes to top frame, i.e., to the top-level form if in mode-4
+ <tr><th align=left width=100><code>Bottom</code>
+     <td>goes to bottom (most recent) frame, i.e., most probably to the
+         form or function that caused the debugger to be entered.
+ <tr><th align=left width=100><code>Backtrace</code>
+     <td>lists the stack in current mode, bottom frame first, top frame last.
+ <tr><th align=left width=100><code>Backtrace-1</code>
+     <td>lists the stack in mode 1.
+ <tr><th align=left width=100><code>Backtrace-2</code>
+     <td>lists the stack in mode 2.
+ <tr><th align=left width=100><code>Backtrace-3</code>
+     <td>lists the stack in mode 3.
+ <tr><th align=left width=100><code>Backtrace-4</code>
+     <td>lists the stack in mode 4.
+ <tr><th align=left width=100><code>Backtrace-5</code>
+     <td>lists the stack in mode 5.
+</table>
+
+<p>If the current stack frame is an <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eval.html">
+<code>eval</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_apply.html">
+<code>apply</code></a> frame, the following commands are available as well:
+
+<table border=1>
+<tr><th align=left width=100><code>Break+</code>
+    <td>sets a breakpoint in the current frame. When the corresponding
+     form or function will be left, the debugger will be entered again,
+     with the variable <code>*trace-values*</code> containing a list of
+     its values.
+<tr><th align=left width=100><code>Break-</code>
+    <td>removes a breakpoint from the current frame.
+<tr><th align=left width=100><code>Redo</code>
+    <td>re-evaluates the corresponding form or function call. This
+     command can be used to restart parts of a computation without
+     aborting it entirely.
+<tr><th align=left width=100><code>Return</code>
+    <td>leaves the current frame. You will be prompted for the return
+     values.
+</table>
+
+<p>Commands specific to the debugger:
+
+<table border=1>
+<tr><th align=left width=100><code>Continue</code>
+    <td>continues evaluation of the program.
+</table>
+
+<p>Commands specific to the stepper:
+
+<table border=1>
+<tr><th align=left width=100><code>Step</code>
+    <td>step into a form: evaluate this form in single step mode
+<tr><th align=left width=100><code>Next</code>
+    <td>step over a form: evaluate this form at once
+<tr><th align=left width=100><code>Over</code>
+    <td>step over this level: evaluate at once up to the next return
+<tr><th align=left width=100><code>Continue</code>
+    <td>switch off single step mode, continue evaluation
+</table>
+
+<p>The stepper is usually used like this: If some form returns a strange
+value or results in an error, call <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_step.html">step</a> <var>form</var>)</code> and
+navigate using the commands <code>Step</code> and <code>Next</code>
+until you reach the form you regard as responsible. If you are too fast
+(execute <code>Next</code> once and get the error), there is no way
+back; you have to restart the entire stepper session. If you are too
+slow (stepped into a function or a form which certainly is OK), a couple
+of <code>Next</code> commands or one <code>Over</code> command will help.
+
+<h3><a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_the_envir_t_dictionary.html">
+    25.2 The Environment Dictionary</a></h3>
+
+<!-- #ifdef HAVE_DISASSEMBLER -->
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_disassemble.html">
+    disassemble</a></h4>
+
+<dl>
+<dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+<dd><code><strong><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_disassemble.html">
+disassemble</a></strong></code> can disassemble to machine
+code, provided that GNU gdb is present.  In that case the argument may
+be a <code>system-function</code>, a <code>foreign-function</code>, a
+special operator indicator, a symbol denoting one of these, a number, or a
+string.
+</dl>
+<!-- #endif -->
+
+<h4>uncompile</h4>
+
+<p>The function <code><strong>uncompile</strong></code> does the
+converse of <code>compile</code>: <code>(uncompile
+<var>function-name</var>)</code> reverts an interpreted function that
+has been entered or loaded in the same session and then compiled back to
+its interpreted form.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/stagenfun_doc_umentationcp.html">
+    documentation</a></h4>
+
+<p>No on-line documentation is available for the system functions (yet).
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_tracecm_untrace.html">
+    trace</a></h4>
+
+<code>(trace <var>fun</var> ...)</code> makes the functions
+<var>fun</var>, ... traced. Syntax of <var>fun</var>: Either a symbol:
+<var>symbol</var> or a list of a symbol and some keywords and arguments
+(which must come in pairs!):
+
+       <code>(<var>symbol</var></code>
+         <table>
+         <tr><td><code>[:suppress-if <var>form</var>]</code>
+             <td> no trace output as long as <var>form</var> is true
+         <tr><td><code>[:step-if <var>form</var>]</code>
+             <td> invokes the stepper as soon as <var>form</var> is true
+         <tr><td><code>[:pre <var>form</var>]</code>
+             <td> evaluates <var>form</var> before calling the function
+         <tr><td><code>[:post <var>form</var>]</code>
+             <td> evaluates <var>form</var> after return from the function
+         <tr><td><code>[:pre-break-if <var>form</var>]</code>
+             <td> goes into the break loop before calling the function
+                  if <var>form</var> is true
+         <tr><td><code>[:post-break-if <var>form</var>]</code>
+             <td> goes into the break loop after return from the
+                  function if <var>form</var> is true
+         <tr><td><code>[:pre-print <var>form</var>]</code>
+             <td> prints the values of <var>form</var> before calling
+                  the function
+         <tr><td><code>[:post-print <var>form</var>]</code>
+             <td> prints the values of <var>form</var> after return from
+                  the function
+         <tr><td><code>[:print <var>form</var>]</code>
+             <td> prints the values of <var>form</var> both before
+                  calling and after return from the function
+         </table>
+       <code>)</code>
+
+<p>In all these forms you can access
+<table>
+  <tr><td>the function itself
+   <td>as <code><strong>lisp:*trace-function*</strong></code>,
+  <tr><td>the arguments to the function
+   <td>as <code><strong>lisp:*trace-args*</strong></code>,
+  <tr><td>the function/macro call as form
+   <td>as <code><strong>lisp:*trace-form*</strong></code>,
+  <tr><td>after return from the function: the list of return values from
+    the function call
+   <td>as <code><strong>lisp:*trace-values*</strong></code>,
+  </table>
+and you can leave the function call with specified values by using
+<code>return</code>.
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_tracecm_untrace.html"><code>trace</code></a>
+and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_tracecm_untrace.html">
+<code>untrace</code></a> are also applicable to functions <code>(<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_setfcm_psetf.html">setf</a>
+<var>symbol</var>)</code> and to macros, but not to locally defined
+functions and macros.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_inspect.html">
+    inspect</a></h4>
+
+<p>The function <strong><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_inspect.html">
+<code>inspect</code></a></strong> is not built in.  Two implementations
+are available as add-ons from the <a
+href="ftp://clisp.cons.org/pub/lisp/clisp/contrib/">
+ftp://clisp.cons.org/pub/lisp/clisp/contrib/</a> directory.)
+
+<a name="space"></a><h4>lisp:space</h4>
+
+<p>The macro <code><strong>lisp:space</strong></code> is like the macro
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_time.html">
+<code>time</code></a>: <code>(lisp:space <var>form</var>)</code>
+evaluates the <var>form</var>, and, as a side effect, outputs
+information about the memory allocations caused by this evaluation.  It
+also prints everything printed by <a href="#time"><code>time</code></a>.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_room.html">
+    room</a></h4>
+
+<p>The function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_room.html">
+<code>room</code></a> returns two values:
+the number of bytes currently occupied by Lisp objects, and the number
+of bytes that can be allocated before the next regular garbage
+collection occurs.
+
+<p>The function <code><strong>lisp:gc</strong></code> starts global
+garbage collection and its return value has the same meaning as the
+second value of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_room.html">
+<code>room</code></a>.
+
+<a name="time"></a><h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_time.html">
+    time</a> macro</h4>
+
+<p>The timing data printed by the macro
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_time.html">
+<code>time</code></a> includes: The real time (elapsed time), the run
+time (processor time for this process), the number of bytes allocated
+(use the <a href="#space"><code>lisp:space</code></a> macro for more
+detailed analysis), and the number of GCs performed, if any.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_ed.html">
+    ed</a></h4>
+
+<p>The function <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_ed.html">
+<code>ed</code></a> calls the external
+editor specified by the variable
+<code><strong>lisp:*editor*</strong></code> (see
+<code>config.lsp</code>). If the argument is a function name which was
+defined in the current session (not loaded from a file), the program
+text to be edited is a pretty-printed version (without comments) of the
+text which was used to define the function.
+
+<h4>clock time</h4>
+
+<!-- #if !(defined(UNIX) || defined(WIN32)) -->
+<dl>
+<dt><em>Platform dependent: <strong>DOS</strong>, <strong>OS/2</strong>,
+    <strong>Amiga</strong>, <strong>Acorn</strong> platforms only.</em>
+<dd>The variable <code><strong>lisp:*default-time-zone*</strong></code>
+contains the default time zone used by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_encode-universal-time.html">
+<code>encode-universal-time</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_decode-universal-time.html">
+<code>decode-universal-time</code></a>. It is initially set to -1 (which
+means 1 hour east of Greenwich, i.e., Mid European Time).
+</dl>
+<!-- #endif -->
+
+<p>The timezone in a decoded time must not necessarily be an integer,
+but (as float or rational number) it should be a multiple of
+<code>1/3600</code>.
+
+<p><table border=1>
+<tr><th><em>Platform dependent:</em>
+    <!-- #if defined(TIME_MSDOS) || defined(TIME_RISCOS) -->
+    <th>DOS, OS/2, Acorn
+    <!-- #endif -->
+    <!-- #ifdef TIME_AMIGAOS -->
+    <th>Amiga
+    <!-- #endif -->
+    <!-- #ifdef TIME_UNIX -->
+    <th>UNIX
+    <!-- #endif -->
+    <!-- #ifdef TIME_WIN32 -->
+    <th>Win32
+    <!-- #endif -->
+<tr><th><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_intern_s-per-second.html">
+    <code>internal-time-units-per-second</code></a>
+    <td>100 <td>50 <td>1,000,000 <td>10,000,000
+</table>
+
+<p><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_get-internal-run-time.html">
+<code>get-internal-run-time</code></a> returns the amount of run time
+consumed by the current CLISP process since its startup.
+
+<h4>machine</h4>
+<dl>
+<!-- #ifdef MACHINE_KNOWN -->
+ <dt><em>Platform dependent: <strong>UNIX</strong>,
+     <strong>Win32</strong> platforms only.</em>
+  <dd>The functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_short-sit_ng-site-name.html">
+  <code>short-site-name</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_short-sit_ng-site-name.html">
+  <code>long-site-name</code></a> should be defined in a site-specific
+  <code>config.lsp</code> file.
+<!-- #else -->
+ <dt><em>Platform dependent: <strong>DOS</strong>,
+     <strong>OS/2</strong>, <strong>Amiga</strong>,
+     <strong>Acorn</strong> platforms only.</em>
+  <dd>The functions <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_machine-type.html">
+  <code>machine-type</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_machine-version.html">
+  <code>machine-version</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_machine-instance.html">
+  <code>machine-instance</code></a> and
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_short-sit_ng-site-name.html">
+  <code>short-site-name</code></a>,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_short-sit_ng-site-name.html">
+  <code>long-site-name</code></a> should be defined by every user in his
+  site-specific <code>config.lsp</code> file.
+<!-- #endif -->
+</dl>
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_aproposcm_apropos-list.html">
+    apropos, apropos-list</a></h4>
+
+The search performed by
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_aproposcm_apropos-list.html">
+<code>apropos</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_aproposcm_apropos-list.html">
+<code>apropos-list</code></a> is case-insensitive.
+
+<h4><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_dribble.html">
+    dribble</a></h4>
+
+If <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_dribble.html">
+<code>dribble</code></a> is called with an argument, and dribbling is
+already enabled, a warning is printed, and the new dribbling request is
+ignored.
+
+<h2><a name="glossary"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-26.html">
+    Chapter 26: Glossary</a></h2>
+
+<p>No notes.
+
+<h2><a name="appendix"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Body/chap-a.html">
+    Appendix</a></h2>
+
+<p>No notes.
+
+<h2><a name="issues"></a><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/Issues-Categorized.html">
+    X3J13 Issue Index</a></h2>
+
+<p>This is the list of ANSI CL issues and their current status in CLISP,
+i.e., whether CLISP supports code that makes use of the functionality
+specified by the vote.
+
+<dl>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss001.html">
+     &amp;ENVIRONMENT-BINDING-ORDER:FIRST</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss002.html">
+     ACCESS-ERROR-NAME</a>                         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss003.html">
+     ADJUST-ARRAY-DISPLACEMENT</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss004.html">
+     ADJUST-ARRAY-FILL-POINTER</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss005.html">
+     ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss006.html">
+     ALLOCATE-INSTANCE:ADD</a>                     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss007.html">
+     ALLOW-LOCAL-INLINE:INLINE-NOTINLINE</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss008.html">
+     ALLOW-OTHER-KEYS-NIL:PERMIT</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss009.html">
+     AREF-1D</a>                                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss010.html">
+     ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss011.html">
+     ARGUMENT-MISMATCH-ERROR-MOON:FIX</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss012.html">
+     ARGUMENT-MISMATCH-ERROR:MORE-CLARIFICATIONS</a>
+     <dd>yes, except for argument list checking in
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/locfun_call-next-method.html">
+     <code>call-next-method</code></a> in compiled code (items 11,12)
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss013.html">
+     ARGUMENTS-UNDERSPECIFIED:SPECIFY</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss014.html">
+     ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss015.html">
+     ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING</a>
+     <dd>yes for arrays, no for complex numbers
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss016.html">
+     ASSERT-ERROR-TYPE:ERROR</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss017.html">
+     ASSOC-RASSOC-IF-KEY</a>                       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss018.html">
+     ASSOC-RASSOC-IF-KEY:YES</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss019.html">
+     BOA-AUX-INITIALIZATION:ERROR-ON-READ</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss020.html">
+     BREAK-ON-WARNINGS-OBSOLETE:REMOVE</a>         <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss021.html">
+     BROADCAST-STREAM-RETURN-VALUES:CLARIFY-MINIMALLY</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss022.html">
+     BUTLAST-NEGATIVE:SHOULD-SIGNAL</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss023.html">
+     CHANGE-CLASS-INITARGS:PERMIT</a>              <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss024.html">
+     CHAR-NAME-CASE:X3J13-MAR-91</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss025.html">
+     CHARACTER-LOOSE-ENDS:FIX</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss026.html">
+     CHARACTER-PROPOSAL:2</a>                      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss027.html">
+     CHARACTER-PROPOSAL:2-1-1</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss028.html">
+     CHARACTER-PROPOSAL:2-1-2</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss029.html">
+     CHARACTER-PROPOSAL:2-2-1</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss030.html">
+     CHARACTER-PROPOSAL:2-3-1</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss031.html">
+     CHARACTER-PROPOSAL:2-3-2</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss032.html">
+     CHARACTER-PROPOSAL:2-3-3</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss033.html">
+     CHARACTER-PROPOSAL:2-3-4</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss034.html">
+     CHARACTER-PROPOSAL:2-3-5</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss035.html">
+     CHARACTER-PROPOSAL:2-3-6</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss036.html">
+     CHARACTER-PROPOSAL:2-4-1</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss037.html">
+     CHARACTER-PROPOSAL:2-4-2</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss038.html">
+     CHARACTER-PROPOSAL:2-4-3</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss039.html">
+     CHARACTER-PROPOSAL:2-5-2</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss040.html">
+     CHARACTER-PROPOSAL:2-5-6</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss041.html">
+     CHARACTER-PROPOSAL:2-5-7</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss042.html">
+     CHARACTER-PROPOSAL:2-6-1</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss043.html">
+     CHARACTER-PROPOSAL:2-6-2</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss044.html">
+     CHARACTER-PROPOSAL:2-6-3</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss045.html">
+     CHARACTER-PROPOSAL:2-6-5</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss046.html">
+     CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss047.html">
+     CLASS-OBJECT-SPECIALIZER:AFFIRM</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss048.html">
+     CLOS-CONDITIONS-AGAIN:ALLOW-SUBSET</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss049.html">
+     CLOS-CONDITIONS:INTEGRATE</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss050.html">
+     CLOS-ERROR-CHECKING-ORDER:NO-APPLICABLE-METHOD-FIRST</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss051.html">
+     CLOS-MACRO-COMPILATION:MINIMAL</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss052.html">
+     CLOSE-CONSTRUCTED-STREAM:ARGUMENT-STREAM-ONLY</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss053.html">
+     CLOSED-STREAM-OPERATIONS:ALLOW-INQUIRY</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss054.html">
+     COERCING-SETF-NAME-TO-FUNCTION:ALL-FUNCTION-NAMES</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss055.html">
+     COLON-NUMBER</a>                              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss056.html">
+     COMMON-FEATURES:SPECIFY</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss057.html">
+     COMMON-TYPE:REMOVE</a> <dd>yes, still present in package LISP
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss058.html">
+     COMPILE-ARGUMENT-PROBLEMS-AGAIN:FIX</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss059.html">
+     COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss060.html">
+     COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss061.html">
+     COMPILE-FILE-PACKAGE</a>                      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss062.html">
+     COMPILE-FILE-PATHNAME-ARGUMENTS:MAKE-CONSISTENT</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss063.html">
+     COMPILE-FILE-SYMBOL-HANDLING:NEW-REQUIRE-CONSISTENCY</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss064.html">
+     COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss065.html">
+     COMPILER-DIAGNOSTICS:USE-HANDLER</a>          <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss066.html">
+     COMPILER-LET-CONFUSION:ELIMINATE</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss067.html">
+     COMPILER-VERBOSITY:LIKE-LOAD</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss068.html">
+     COMPILER-WARNING-STREAM</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss069.html">
+     COMPLEX-ATAN-BRANCH-CUT:TWEAK</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss070.html">
+     COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss071.html">
+     COMPLEX-RATIONAL-RESULT:EXTEND</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss072.html">
+     COMPUTE-APPLICABLE-METHODS:GENERIC</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss073.html">
+     CONCATENATE-SEQUENCE:SIGNAL-ERROR</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss074.html">
+     CONDITION-ACCESSORS-SETFABLE:NO</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss075.html">
+     CONDITION-RESTARTS:BUGGY</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss076.html">
+     CONDITION-RESTARTS:PERMIT-ASSOCIATION</a>     <dd>yes, except for (6)
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss077.html">
+     CONDITION-SLOTS:HIDDEN</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss078.html">
+     CONS-TYPE-SPECIFIER:ADD</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss079.html">
+     CONSTANT-CIRCULAR-COMPILATION:YES</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss080.html">
+     CONSTANT-COLLAPSING:GENERALIZE</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss081.html">
+     CONSTANT-COMPILABLE-TYPES:SPECIFY</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss082.html">
+     CONSTANT-FUNCTION-COMPILATION:NO</a>          <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss083.html">
+     CONSTANT-MODIFICATION:DISALLOW</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss084.html">
+     CONSTANTP-DEFINITION:INTENTIONAL</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss085.html">
+     CONSTANTP-ENVIRONMENT:ADD-ARG</a>             <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss086.html">
+     CONTAGION-ON-NUMERICAL-COMPARISONS:TRANSITIVE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss087.html">
+     COPY-SYMBOL-COPY-PLIST:COPY-LIST</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss088.html">
+     COPY-SYMBOL-PRINT-NAME:EQUAL</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss089.html">
+     DATA-IO:ADD-SUPPORT</a>
+     <dd>yes for <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-readablyst.html">
+         <code>*print-readably*</code></a>,
+         <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stread-evalst.html">
+         <code>*read-eval*</code></a> and
+         <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_with-stan_rd-io-syntax.html">
+         <code>with-standard-io-syntax</code></a>, no for everything else
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss090.html">
+     DATA-TYPES-HIERARCHY-UNDERSPECIFIED</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss091.html">
+     DEBUGGER-HOOK-VS-BREAK:CLARIFY</a>            <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss092.html">
+     DECLARATION-SCOPE:NO-HOISTING</a>             <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss093.html">
+     DECLARE-ARRAY-TYPE-ELEMENT-REFERENCES:RESTRICTIVE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss094.html">
+     DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss095.html">
+     DECLARE-MACROS:FLUSH</a>                      <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss096.html">
+     DECLARE-TYPE-FREE:LEXICAL</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss097.html">
+     DECLS-AND-DOC</a>                             <dd>??
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss098.html">
+     DECODE-UNIVERSAL-TIME-DAYLIGHT:LIKE-ENCODE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss099.html">
+     DEFCONSTANT-SPECIAL:NO</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss100.html">
+     DEFGENERIC-DECLARE:ALLOW-MULTIPLE</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss101.html">
+     DEFINE-COMPILER-MACRO:X3J13-NOV89</a>         <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss102.html">
+     DEFINE-CONDITION-SYNTAX:INCOMPATIBLY-MORE-LIKE-DEFCLASS+EMPHASIZE-READ-ONLY</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss103.html">
+     DEFINE-METHOD-COMBINATION-BEHAVIOR:CLARIFY</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss104.html">
+     DEFINING-MACROS-NON-TOP-LEVEL:ALLOW</a>       <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss105.html">
+     DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss106.html">
+     DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss107.html">
+     DEFMETHOD-DECLARATION-SCOPE:CORRESPONDS-TO-BINDINGS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss108.html">
+     DEFPACKAGE:ADDITION</a>                       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss109.html">
+     DEFSTRUCT-CONSTRUCTOR-KEY-MIXTURE:ALLOW-KEY</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss110.html">
+     DEFSTRUCT-CONSTRUCTOR-OPTIONS:EXPLICIT</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss111.html">
+     DEFSTRUCT-CONSTRUCTOR-SLOT-VARIABLES:NOT-BOUND</a>
+     <dd>no (furthermore it gets hairy when applied to
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_defstruct.html">
+     BOA constructors</a>)
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss112.html">
+     DEFSTRUCT-COPIER-ARGUMENT-TYPE:RESTRICT</a>   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss113.html">
+     DEFSTRUCT-COPIER:ARGUMENT-TYPE</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss114.html">
+     DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss115.html">
+     DEFSTRUCT-INCLUDE-DEFTYPE:EXPLICITLY-UNDEFINED</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss116.html">
+     DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss117.html">
+     DEFSTRUCT-PRINT-FUNCTION-INHERITANCE:YES</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss118.html">
+     DEFSTRUCT-REDEFINITION:ERROR</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss119.html">
+     DEFSTRUCT-SLOTS-CONSTRAINTS-NAME:DUPLICATES-ERROR</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss120.html">
+     DEFSTRUCT-SLOTS-CONSTRAINTS-NUMBER</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss121.html">
+     DEFTYPE-DESTRUCTURING:YES</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss122.html">
+     DEFTYPE-KEY:ALLOW</a>                         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss123.html">
+     DEFVAR-DOCUMENTATION:UNEVALUATED</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss124.html">
+     DEFVAR-INIT-TIME:NOT-DELAYED</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss125.html">
+     DEFVAR-INITIALIZATION:CONSERVATIVE</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss126.html">
+     DEPRECATION-POSITION:LIMITED</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss127.html">
+     DESCRIBE-INTERACTIVE:NO</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss128.html">
+     DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT</a>   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss129.html">
+     DESTRUCTIVE-OPERATIONS:SPECIFY</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss130.html">
+     DESTRUCTURING-BIND:NEW-MACRO</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss131.html">
+     DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss132.html">
+     DISPLACED-ARRAY-PREDICATE:ADD</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss133.html">
+     DO-SYMBOLS-BLOCK-SCOPE:ENTIRE-FORM</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss134.html">
+     DO-SYMBOLS-DUPLICATES</a>                     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss135.html">
+     DOCUMENTATION-FUNCTION-BUGS:FIX</a>           <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss136.html">
+     DOCUMENTATION-FUNCTION-TANGLED:REQUIRE-ARGUMENT</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss137.html">
+     DOTIMES-IGNORE:X3J13-MAR91</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss138.html">
+     DOTTED-LIST-ARGUMENTS:CLARIFY</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss139.html">
+     DOTTED-MACRO-FORMS:ALLOW</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss140.html">
+     DRIBBLE-TECHNIQUE</a>                         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss141.html">
+     DYNAMIC-EXTENT-FUNCTION:EXTEND</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss142.html">
+     DYNAMIC-EXTENT:NEW-DECLARATION</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss143.html">
+     EQUAL-STRUCTURE:MAYBE-STATUS-QUO</a>
+     <dd>no for <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_equalp.html">
+     <code>equalp</code></a> on <a href="#hash">hash tables</a>,
+     yes for everything else
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss144.html">
+     ERROR-TERMINOLOGY-WARNING:MIGHT</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss145.html">
+     EVAL-OTHER:SELF-EVALUATE</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss146.html">
+     EVAL-TOP-LEVEL:LOAD-LIKE-COMPILE-FILE</a>
+     <dd>yes, except maybe if <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+     <code>load</code></a> <a href="#loadfile">:compiling</a>
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+     <code>t</code></a>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss147.html">
+     EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss148.html">
+     EVAL-WHEN-OBSOLETE-KEYWORDS:X3J13-MAR-1993</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss149.html">
+     EVALHOOK-STEP-CONFUSION:FIX</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss150.html">
+     EVALHOOK-STEP-CONFUSION:X3J13-NOV-89</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss151.html">
+     EXIT-EXTENT-AND-CONDITION-SYSTEM:LIKE-DYNAMIC-BINDINGS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss152.html">
+     EXIT-EXTENT:MINIMAL</a> <dd>yes, actually implement MEDIUM
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss153.html">
+     EXPT-RATIO:P.211</a>                          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss154.html">
+     EXTENSIONS-POSITION:DOCUMENTATION</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss155.html">
+     EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss156.html">
+     EXTRA-RETURN-VALUES:NO</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss157.html">
+     FILE-OPEN-ERROR:SIGNAL-FILE-ERROR</a>         <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss158.html">
+     FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION</a>    <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss159.html">
+     FLET-DECLARATIONS</a>                         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss160.html">
+     FLET-DECLARATIONS:ALLOW</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss161.html">
+     FLET-IMPLICIT-BLOCK:YES</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss162.html">
+     FLOAT-UNDERFLOW:ADD-VARIABLES</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss163.html">
+     FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss164.html">
+     FORMAT-ATSIGN-COLON</a>                       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss165.html">
+     FORMAT-COLON-UPARROW-SCOPE</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss166.html">
+     FORMAT-COMMA-INTERVAL</a>                     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss167.html">
+     FORMAT-E-EXPONENT-SIGN:FORCE-SIGN</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss168.html">
+     FORMAT-OP-C</a>                               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss169.html">
+     FORMAT-PRETTY-PRINT:YES</a>
+     <dd>yes, except that
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-1.html"><code>~F</code></a>,
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-2.html"><code>~E</code></a>,
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-3.html"><code>~G</code></a>,
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3-3-4.html"><code>~$</code></a>
+     also bind <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-b_rint-radixst.html">
+     <code>*print-base*</code></a> to 10
+     and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stprint-b_rint-radixst.html">
+     <code>*print-radix*</code></a> to
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+     <code>nil</code></a>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss170.html">
+     FORMAT-STRING-ARGUMENTS:SPECIFY</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss171.html">
+     FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss172.html">
+     FUNCTION-COMPOSITION:JAN89-X3J13</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss173.html">
+     FUNCTION-DEFINITION:JAN89-X3J13</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss174.html">
+     FUNCTION-NAME:LARGE</a>                       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss175.html">
+     FUNCTION-TYPE</a>                             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss176.html">
+     FUNCTION-TYPE-ARGUMENT-TYPE-SEMANTICS:RESTRICTIVE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss177.html">
+     FUNCTION-TYPE-KEY-NAME:SPECIFY-KEYWORD</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss178.html">
+     FUNCTION-TYPE-REST-LIST-ELEMENT:USE-ACTUAL-ARGUMENT-TYPE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss179.html">
+     FUNCTION-TYPE:X3J13-MARCH-88</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss180.html">
+     GENERALIZE-PRETTY-PRINTER:UNIFY</a>           <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss181.html">
+     GENERIC-FLET-POORLY-DESIGNED:DELETE</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss182.html">
+     GENSYM-NAME-STICKINESS:LIKE-TEFLON</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss183.html">
+     GENTEMP-BAD-IDEA:DEPRECATE</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss184.html">
+     GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss185.html">
+     GET-SETF-METHOD-ENVIRONMENT:ADD-ARG</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss186.html">
+     HASH-TABLE-ACCESS:X3J13-MAR-89</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss187.html">
+     HASH-TABLE-KEY-MODIFICATION:SPECIFY</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss188.html">
+     HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss189.html">
+     HASH-TABLE-REHASH-SIZE-INTEGER</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss190.html">
+     HASH-TABLE-SIZE:INTENDED-ENTRIES</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss191.html">
+     HASH-TABLE-TESTS:ADD-EQUALP</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss192.html">
+     IEEE-ATAN-BRANCH-CUT:SPLIT</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss193.html">
+     IGNORE-USE-TERMINOLOGY:VALUE-ONLY</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss194.html">
+     IMPORT-SETF-SYMBOL-PACKAGE</a>                <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss195.html">
+     IN-PACKAGE-FUNCTIONALITY:MAR89-X3J13</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss196.html">
+     IN-SYNTAX:MINIMAL</a>                         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss197.html">
+     INITIALIZATION-FUNCTION-KEYWORD-CHECKING</a>  <dd>??
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss198.html">
+     ISO-COMPATIBILITY:ADD-SUBSTRATE</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss199.html">
+     JUN90-TRIVIAL-ISSUES:11</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss200.html">
+     JUN90-TRIVIAL-ISSUES:14</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss201.html">
+     JUN90-TRIVIAL-ISSUES:24</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss202.html">
+     JUN90-TRIVIAL-ISSUES:25</a>                   <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss203.html">
+     JUN90-TRIVIAL-ISSUES:27</a>
+     <dd>yes for <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_the.html">
+     <code>the</code></a>, no for
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_apply.html">
+     <code>apply</code></a> (spec not clear)
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss204.html">
+     JUN90-TRIVIAL-ISSUES:3</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss205.html">
+     JUN90-TRIVIAL-ISSUES:4</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss206.html">
+     JUN90-TRIVIAL-ISSUES:5</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss207.html">
+     JUN90-TRIVIAL-ISSUES:9</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss208.html">
+     KEYWORD-ARGUMENT-NAME-PACKAGE:ANY</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss209.html">
+     LAST-N</a>                                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss210.html">
+     LCM-NO-ARGUMENTS:1</a>                        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss211.html">
+     LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss212.html">
+     LISP-PACKAGE-NAME:COMMON-LISP</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss213.html">
+     LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss214.html">
+     LISP-SYMBOL-REDEFINITION:MAR89-X3J13</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss215.html">
+     LOAD-OBJECTS:MAKE-LOAD-FORM</a>               <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss216.html">
+     LOAD-TIME-EVAL:R**2-NEW-SPECIAL-FORM</a>      <dd>obsolete
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss217.html">
+     LOAD-TIME-EVAL:R**3-NEW-SPECIAL-FORM</a>
+     <dd>yes, except for macro expansion at compile time
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss218.html">
+     LOAD-TRUENAME:NEW-PATHNAME-VARIABLES</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss219.html">
+     LOCALLY-TOP-LEVEL:SPECIAL-FORM</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss220.html">
+     LOOP-AND-DISCREPANCY:NO-REITERATION</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss221.html">
+     LOOP-FOR-AS-ON-TYPO:FIX-TYPO</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss222.html">
+     LOOP-INITFORM-ENVIRONMENT:PARTIAL-INTERLEAVING-VAGUE</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss223.html">
+     LOOP-MISCELLANEOUS-REPAIRS:FIX</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss224.html">
+     LOOP-NAMED-BLOCK-NIL:OVERRIDE</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss225.html">
+     LOOP-PRESENT-SYMBOLS-TYPO:FLUSH-WRONG-WORDS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss226.html">
+     LOOP-SYNTAX-OVERHAUL:REPAIR</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss227.html">
+     MACRO-AS-FUNCTION:DISALLOW</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss228.html">
+     MACRO-DECLARATIONS:MAKE-EXPLICIT</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss229.html">
+     MACRO-ENVIRONMENT-EXTENT:DYNAMIC</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss230.html">
+     MACRO-FUNCTION-ENVIRONMENT</a>                <dd>obsolete
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss231.html">
+     MACRO-FUNCTION-ENVIRONMENT:YES</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss232.html">
+     MACRO-SUBFORMS-TOP-LEVEL-P:ADD-CONSTRAINTS</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss233.html">
+     MACROEXPAND-HOOK-DEFAULT:EXPLICITLY-VAGUE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss234.html">
+     MACROEXPAND-HOOK-INITIAL-VALUE:IMPLEMENTATION-DEPENDENT</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss235.html">
+     MACROEXPAND-RETURN-VALUE:TRUE</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss236.html">
+     MAKE-LOAD-FORM-CONFUSION:REWRITE</a>          <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss237.html">
+     MAKE-LOAD-FORM-SAVING-SLOTS:NO-INITFORMS</a>  <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss238.html">
+     MAKE-PACKAGE-USE-DEFAULT:IMPLEMENTATION-DEPENDENT</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss239.html">
+     MAP-INTO:ADD-FUNCTION</a>                     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss240.html">
+     MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss241.html">
+     METACLASS-OF-SYSTEM-CLASS:UNSPECIFIED</a>     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss242.html">
+     METHOD-COMBINATION-ARGUMENTS:CLARIFY</a>      <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss243.html">
+     METHOD-INITFORM:FORBID-CALL-NEXT-METHOD</a>   <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss244.html">
+     MUFFLE-WARNING-CONDITION-ARGUMENT</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss245.html">
+     MULTIPLE-VALUE-SETQ-ORDER:LIKE-SETF-OF-VALUES</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss246.html">
+     MULTIPLE-VALUES-LIMIT-ON-VARIABLES:UNDEFINED</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss247.html">
+     NINTERSECTION-DESTRUCTION</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss248.html">
+     NINTERSECTION-DESTRUCTION:REVERT</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss249.html">
+     NOT-AND-NULL-RETURN-VALUE:X3J13-MAR-93</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss250.html">
+     NTH-VALUE:ADD</a>                             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss251.html">
+     OPTIMIZE-DEBUG-INFO:NEW-QUALITY</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss252.html">
+     PACKAGE-CLUTTER:REDUCE</a>                    <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss253.html">
+     PACKAGE-DELETION:NEW-FUNCTION</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss254.html">
+     PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss255.html">
+     PARSE-ERROR-STREAM:SPLIT-TYPES</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss256.html">
+     PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss257.html">
+     PATHNAME-COMPONENT-VALUE:SPECIFY</a>          <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss258.html">
+     PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss259.html">
+     PATHNAME-LOGICAL:ADD</a>                      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss260.html">
+     PATHNAME-PRINT-READ:SHARPSIGN-P</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss261.html">
+     PATHNAME-STREAM</a>                           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss262.html">
+     PATHNAME-STREAM:FILES-OR-SYNONYM</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss263.html">
+     PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss264.html">
+     PATHNAME-SYMBOL</a>                           <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss265.html">
+     PATHNAME-SYNTAX-ERROR-TIME:EXPLICITLY-VAGUE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss266.html">
+     PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN</a>   <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss267.html">
+     PATHNAME-WILD:NEW-FUNCTIONS</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss268.html">
+     PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss269.html">
+     PLIST-DUPLICATES:ALLOW</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss270.html">
+     PRETTY-PRINT-INTERFACE</a>                    <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss271.html">
+     PRINC-READABLY:X3J13-DEC-91</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss272.html">
+     PRINT-CASE-BEHAVIOR:CLARIFY</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss273.html">
+     PRINT-CASE-PRINT-ESCAPE-INTERACTION:VERTICAL-BAR-RULE-NO-UPCASE</a>
+     <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss274.html">
+     PRINT-CIRCLE-SHARED:RESPECT-PRINT-CIRCLE</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss275.html">
+     PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss276.html">
+     PRINT-READABLY-BEHAVIOR:CLARIFY</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss277.html">
+     PRINTER-WHITESPACE:JUST-ONE-SPACE</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss278.html">
+     PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss279.html">
+     PUSH-EVALUATION-ORDER:FIRST-ITEM</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss280.html">
+     PUSH-EVALUATION-ORDER:ITEM-FIRST</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss281.html">
+     PUSHNEW-STORE-REQUIRED:UNSPECIFIED</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss282.html">
+     QUOTE-SEMANTICS:NO-COPYING</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss283.html">
+     RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER</a>
+     <dd>yes, when
+     <a href="#count-ansi"><code>lisp:*sequence-count-ansi*</code></a>
+     is non-<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>;
+     otherwise negative <code>:count</code> values are not allowed.
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss284.html">
+     RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss285.html">
+     READ-AND-WRITE-BYTES:NEW-FUNCTIONS</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss286.html">
+     READ-CASE-SENSITIVITY:READTABLE-KEYWORDS</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss287.html">
+     READ-MODIFY-WRITE-EVALUATION-ORDER:DELAYED-ACCESS-STORES</a> <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss288.html">
+     READ-SUPPRESS-CONFUSING:GENERALIZE</a>
+     <dd>yes, except that <a
+     href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-delimited-list.html">
+     <code>read-delimited-list</code></a> still constructs a list
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss289.html">
+     READER-ERROR:NEW-TYPE</a>                     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss290.html">
+     REAL-NUMBER-TYPE:X3J13-MAR-89</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss291.html">
+     RECURSIVE-DEFTYPE:EXPLICITLY-VAGUE</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss292.html">
+     REDUCE-ARGUMENT-EXTRACTION</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss293.html">
+     REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss294.html">
+     REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss295.html">
+     REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT</a>
+     <dd>yes, except that
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_providecm_require.html">
+     <code>require</code></a> wants a pathname, not a list of pathnames
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss296.html">
+     REQUIRE-PATHNAME-DEFAULTS:ELIMINATE</a>
+     <dd>superseded by <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss294.html">
+     REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91</a>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss297.html">
+     REST-LIST-ALLOCATION:MAY-SHARE</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss298.html">
+     RESULT-LISTS-SHARED:SPECIFY</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss299.html">
+     RETURN-VALUES-UNSPECIFIED:SPECIFY</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss300.html">
+     ROOM-DEFAULT-ARGUMENT:NEW-VALUE</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss301.html">
+     SELF-MODIFYING-CODE:FORBID</a>                <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss302.html">
+     SEQUENCE-TYPE-LENGTH:MUST-MATCH</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss303.html">
+     SETF-APPLY-EXPANSION:IGNORE-EXPANDER</a>      <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss304.html">
+     SETF-FIND-CLASS:ALLOW-NIL</a>                 <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss305.html">
+     SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss306.html">
+     SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss307.html">
+     SETF-MACRO-EXPANSION:LAST</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss308.html">
+     SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss309.html">
+     SETF-MULTIPLE-STORE-VARIABLES:ALLOW</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss310.html">
+     SETF-OF-APPLY:ONLY-AREF-AND-FRIENDS</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss311.html">
+     SETF-OF-VALUES:ADD</a>                        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss312.html">
+     SETF-SUB-METHODS:DELAYED-ACCESS-STORES</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss313.html">
+     SHADOW-ALREADY-PRESENT</a>                    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss314.html">
+     SHADOW-ALREADY-PRESENT:WORKS</a>              <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss315.html">
+     SHARP-COMMA-CONFUSION:REMOVE</a>              <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss316.html">
+     SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED</a>     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss317.html">
+     SHARP-STAR-DELIMITER:NORMAL-DELIMITER</a>     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss318.html">
+     SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss319.html">
+     SLOT-MISSING-VALUES:SPECIFY</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss320.html">
+     SLOT-VALUE-METACLASSES:LESS-MINIMAL</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss321.html">
+     SPECIAL-FORM-P-MISNOMER:RENAME</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss322.html">
+     SPECIAL-TYPE-SHADOWING:CLARIFY</a>            <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss323.html">
+     STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss324.html">
+     STANDARD-REPERTOIRE-GRATUITOUS:RENAME</a>     <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss325.html">
+     STEP-ENVIRONMENT:CURRENT</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss326.html">
+     STEP-MINIMAL:PERMIT-PROGN</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss327.html">
+     STREAM-ACCESS:ADD-TYPES-ACCESSORS</a>         <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss328.html">
+     STREAM-CAPABILITIES:INTERACTIVE-STREAM-P</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss329.html">
+     STRING-COERCION:MAKE-CONSISTENT</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss330.html">
+     STRING-OUTPUT-STREAM-BASHING:UNDEFINED</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss331.html">
+     STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss332.html">
+     SUBSEQ-OUT-OF-BOUNDS</a>                      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss333.html">
+     SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR</a>          <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss334.html">
+     SUBSETTING-POSITION:NONE</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss335.html">
+     SUBTYPEP-ENVIRONMENT:ADD-ARG</a>              <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss336.html">
+     SUBTYPEP-TOO-VAGUE:CLARIFY-MORE</a>           <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss337.html">
+     SXHASH-DEFINITION:SIMILAR-FOR-SXHASH</a>      <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss338.html">
+     SYMBOL-MACROLET-DECLARE:ALLOW</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss339.html">
+     SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss340.html">
+     SYMBOL-MACROLET-TYPE-DECLARATION:NO</a>       <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss341.html">
+     SYMBOL-MACROS-AND-PROCLAIMED-SPECIALS:SIGNALS-AN-ERROR</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss342.html">
+     SYMBOL-PRINT-ESCAPE-BEHAVIOR:CLARIFY</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss343.html">
+     SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss344.html">
+     TAGBODY-TAG-EXPANSION:NO</a>                  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss345.html">
+     TAILP-NIL:T</a>                               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss346.html">
+     TEST-NOT-IF-NOT:FLUSH-ALL</a> <dd>yes, but no warning
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss347.html">
+     THE-AMBIGUITY:FOR-DECLARATION</a>             <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss348.html">
+     THE-VALUES:RETURN-NUMBER-RECEIVED</a>         <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss349.html">
+     TIME-ZONE-NON-INTEGER:ALLOW</a>               <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss350.html">
+     TYPE-DECLARATION-ABBREVIATION:ALLOW-ALL</a>   <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss351.html">
+     TYPE-OF-AND-PREDEFINED-CLASSES:TYPE-OF-HANDLES-FLOATS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss352.html">
+     TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND</a>
+     <dd>yes, except for class
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_method-combination.html">
+      <code>method-combination</code></a>
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss353.html">
+     TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS</a>  <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss354.html">
+     TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss355.html">
+     UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss356.html">
+     UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED</a>
+     <dd>yes, could add error checking
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss357.html">
+     UNREAD-CHAR-AFTER-PEEK-CHAR:DONT-ALLOW</a>    <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss358.html">
+     UNSOLICITED-MESSAGES:NOT-TO-SYSTEM-USER-STREAMS</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss359.html">
+     VARIABLE-LIST-ASYMMETRY:SYMMETRIZE</a>        <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss360.html">
+     WITH-ADDED-METHODS:DELETE</a>                 <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss361.html">
+     WITH-COMPILATION-UNIT:NEW-MACRO</a>           <dd>no
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss362.html">
+     WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss363.html">
+     WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE</a>      <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss364.html">
+     WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss365.html">
+     WITH-OUTPUT-TO-STRING-APPEND-STYLE:VECTOR-PUSH-EXTEND</a> <dd>yes
+ <dt><a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss366.html">
+     WITH-STANDARD-IO-SYNTAX-READTABLE:X3J13-MAR-91</a> <dd>yes
+</dl>
+
+<!-- ======================================================= -->
+<br><hr><br>
+
+<a name="extensions"></a><h2>Extensions-1: Platform independent Extensions</h2>
+
+
+<a name="image"></a><h3>Extensions-1.1. Saving an Image</h3>
+
+<p>The function <code>(<strong>lisp:saveinitmem</strong>
+                       &amp;optional (<var>filename</var> "lispinit.mem")
+                       &amp;key :quiet :init-function)</code>
+saves the running CLISP's memory to a file.  If the <code>:quiet</code>
+argument is not <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, the startup banner and the good-bye message will
+be suppressed. The <code>:init-function</code> argument specifies a
+function that will be executed at startup of the saved image.  The
+starting package of the new image is the one in which you were when you
+invoked <code>lisp:saveinitmem</code>.
+
+
+<a name="quit"></a><h3>Extensions-1.2. Quitting Lisp</h3>
+
+<p>The functions <code>(<strong>lisp:exit</strong>
+[<var>errorp</var>])</code>, <code>(<strong>lisp:quit</strong>
+[<var>errorp</var>])</code> and <code>(<strong>lisp:bye</strong>
+[<var>errorp</var>])</code> - all synonymous - terminate CLISP. If
+<var>errorp</var> is not <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>, CLISP aborts with error status, i.e., the
+environment is informed that the CLISP session did not succeed.
+
+
+<a name="language"></a><h3>Extensions-1.3. The Language</h3>
+
+<p>The language CLISP uses to communicate with the user can be either
+<code>ENGLISH</code> or <code>DEUTSCH</code> (i.e., German) or
+<code>FRANCAIS</code> (i.e., French) or <code>ESPA&Ntilde;OL</code> (i.e.
+Spanish). More languages can be defined through the macro
+<code><strong>lisp:deflanguage</strong></code>: <code>(lisp:deflanguage
+<var>lang</var>)</code> For such an additional language to take effect,
+you must install the corresponding message catalog, or translate the
+messages yourself, using GNU gettext and Emacs po-mode.
+
+<p>The macros <code>ENGLISH</code>, <code>DEUTSCH</code>,
+<code>FRANCAIS</code> produce strings that depends on the language:
+<code>(ENGLISH <var>english-string</var> DEUTSCH
+<var>deutsch-string</var> FRANCAIS <var>francais-string</var>)</code> -
+and all permutations of this - evaluates all of
+<var>english-string</var>, <var>deutsch-string</var>,
+<var>francais-string</var> in no particular order and returns the
+evaluation result corresponding to the user language, be it among these
+three or not.
+
+<p>This works only for strings. For arbitrary language-dependent Lisp objects,
+you define one through the macro
+<code><strong>lisp:definternational</strong></code>:
+<pre><code>(lisp:definternational <var>symbol</var> &amp;optional (t <var>default-language</var>))</code></pre>
+and add language-dependent values through the macro
+<code><strong>lisp:deflocalized</strong></code>:
+<pre><code>(lisp:deflocalized <var>symbol</var> <var>language</var> <var>value-form</var>)</code></pre>
+
+(One such form for each language. Languages without an assigned
+value will be treated like the default-language.) You can then access
+the localized value through the function call
+<pre><code>(<strong>lisp:localized</strong> <var>symbol</var> &amp;optional <var>language</var>)</code></pre>
+
+
+<a name="encoding"></a><h3>Extensions-1.4. Encodings</h3>
+
+<p>An <em>encoding</em> describes the correspondence between characters and
+raw bytes during input/output via streams with element-type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html"><code>character</code></a>.
+
+<p>An encoding is an object composed of the following facets:
+<ul>
+  <li>A <a href="#charset"><em>character set</em></a>. This denotes both
+      the set of characters that can be represented and passed through
+      the I/O channel, and the way these characters translate into raw
+      bytes. In this context, for example, "UTF-8" and "UCS-4" are
+      considered different, although they can represent the same set of
+      characters.
+  <li>A <a href="#newline"><em>line terminator mode</em></a>. This
+      denotes the way newline characters are represented.
+</ul>
+
+<a name="charset"></a><h4>Character Sets</h4>
+
+<dl>
+<!-- #ifndef UNICODE -->
+<dt><em>Platform dependent: Only in CLISP built <strong>without</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+Only one character set is understood: the platform's native (8-bit) character
+set. See <a href="#characters">chapter 13</a>.
+<!-- #else -->
+<dt><em>Platform dependent: Only in CLISP built <strong>with</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>The following character sets are supported, as values of the
+corresponding (constant) symbol in the <code>CHARSET</code> package.
+<ul>
+  <li><code>UCS-2</code> = <code>UNICODE-16</code>
+      = <code>UNICODE-16-BIG-ENDIAN</code>,
+      the 16-bit Unicode character set. Every character is represented as
+      two bytes.
+  <li><code>UNICODE-16-LITTLE-ENDIAN</code>
+  <li><code>UCS-4</code> = <code>UNICODE-32</code>
+      = <code>UNICODE-32-BIG-ENDIAN</code>,
+      the 32-bit Unicode character set. Every character is represented as
+      four bytes. Note that CLISP understands only those characters which
+      are already contained in the 16-bit Unicode character set.
+  <li><code>UNICODE-32-LITTLE-ENDIAN</code>
+  <li><code>UTF-8</code>,
+      the 16-bit Unicode character set. Every character is represented as
+      one to three bytes. ASCII characters represent themselves and need
+      one byte per character. Most Latin/Greek/Cyrillic/Hebrew characters
+      need two bytes per character, and the remaining characters need three
+      bytes per character. This is therefore, in general, the most
+      space-efficient encoding of all of Unicode-16.
+<!-- #ifdef GNU_LIBICONV -->
+  <li><code>UTF-16</code>,
+      the 16-bit Unicode character set. Every character is represented as
+      two bytes.
+  <li><code>UTF-7</code>,
+      the 16-bit Unicode character set. This is a stateful 7-bit encoding.
+      Not all ASCII characters represent themselves.
+<!-- #endif /* GNU_LIBICONV */ -->
+  <li><code>JAVA</code>,
+      the 16-bit Unicode character set. ASCII characters represent themselves
+      and need one byte per character. All other characters are represented
+      by \u<var>nnnn</var> sequences (<var>nnnn</var> a hexadecimal number)
+      and need 6 bytes per character. While this encoding is very comfortable
+      for editing Unicode files using only ASCII aware tools and editors, it
+      cannot faithfully represent all Unicode text. Only text which does not
+      contain \u (backslash followed by lowercase Latin u) can be faithfully
+      represented by this encoding.
+  <li><code>ASCII</code>,
+      the well-known US-centric 7-bit character set (American Standard
+      Code for Information Interchange).
+  <li><code>ISO-8859-1</code>,
+      an extension of the ASCII character set, suitable for the
+      Afrikaans, Albanian, Basque, Breton, Catalan, Cornish, Danish, Dutch,
+      English, Faeroese, Finnish, French, Frisian, Galician, German,
+      Greenlandic, Icelandic, Irish, Italian, Latin, Luxemburgish, Norwegian,
+      Portuguese, Raeto-Romanic, Scottish, Spanish, and Swedish languages.
+  <li><code>ISO-8859-2</code>,
+      an extension of the ASCII character set, suitable for the Croatian,
+      Czech, German, Hungarian, Polish, Slovak, Slovenian, and Sorbian
+      languages.
+  <li><code>ISO-8859-3</code>,
+      an extension of the ASCII character set, suitable for the
+      Esperanto and Maltese languages.
+  <li><code>ISO-8859-4</code>,
+      an extension of the ASCII character set, suitable for the
+      Estonian, Latvian, Lithuanian and Sami (Lappish) languages.
+  <li><code>ISO-8859-5</code>,
+      an extension of the ASCII character set, suitable for the Bulgarian,
+      Byelorussian, Macedonian, Russian, Serbian, and Ukrainian languages.
+  <li><code>ISO-8859-6</code>,
+      suitable for the Arabic language.
+  <li><code>ISO-8859-7</code>,
+      an extension of the ASCII character set, suitable for the Greek
+      language.
+  <li><code>ISO-8859-8</code>,
+      an extension of the ASCII character set, suitable for the Hebrew
+      language (without punctuation).
+  <li><code>ISO-8859-9</code>,
+      an extension of the ASCII character set, suitable for the Turkish
+      language.
+  <li><code>ISO-8859-10</code>,
+      an extension of the ASCII character set, suitable for the Estonian,
+      Icelandic, Inuit (Greenlandic), Latvian, Lithuanian, and Sami (Lappish)
+      languages.
+  <li><code>ISO-8859-13</code>,
+      an extension of the ASCII character set, suitable for the Estonian,
+      Latvian, Lithuanian, Polish and Sami (Lappish) languages.
+  <li><code>ISO-8859-14</code>,
+      an extension of the ASCII character set, suitable for Irish Gaelic,
+      Manx Gaelic, Scottish Gaelic, and Welsh languages.
+  <li><code>ISO-8859-15</code>,
+      an extension of the ASCII character set, suitable for the ISO-8859-1
+      languages, with improvements for French, Finnish and the Euro.
+  <li><code>ISO-8859-16</code>
+      an extension of the ASCII character set, suitable for the Rumanian
+      language.
+  <li><code>KOI8-R</code>,
+      an extension of the ASCII character set,
+      a popular character set for the Russian language.
+  <li><code>KOI8-U</code>,
+      an extension of the ASCII character set,
+      a popular character set for the Ukrainian language.
+<!-- #ifdef GNU_LIBICONV -->
+  <li><code>KOI8-RU</code>,
+      an extension of the ASCII character set, suitable for Russian and/or
+      Ukrainian??
+<!-- #endif /* GNU_LIBICONV */ -->
+  <li><code>JIS_X0201</code>,
+      a character set for the Japanese language.
+  <li><code>MAC-ARABIC</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-CENTRAL-EUROPE</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-CROATIAN</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-CYRILLIC</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-DINGBAT</code>,
+      a platform specific character set.
+  <li><code>MAC-GREEK</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-HEBREW</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-ICELAND</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-ROMAN</code> = <code>MACINTOSH</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-ROMANIA</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-SYMBOL</code>,
+      a platform specific character set.
+  <li><code>MAC-THAI</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-TURKISH</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>MAC-UKRAINE</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>CP437</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set.
+  <li><code>CP437-IBM</code>, an IBM variant of <code>CP437</code>.
+  <li><code>CP737</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Greek language.
+  <li><code>CP775</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for some Baltic languages.
+  <li><code>CP850</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set.
+  <li><code>CP852</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set.
+  <li><code>CP852-IBM</code>, an IBM variant of <code>CP852</code>.
+  <li><code>CP855</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Russian language.
+  <li><code>CP857</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Turkish language.
+  <li><code>CP860</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Portuguese language.
+  <li><code>CP860-IBM</code>, an IBM variant of <code>CP860</code>.
+  <li><code>CP861</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Icelandic language.
+  <li><code>CP861-IBM</code>, an IBM variant of <code>CP861</code>.
+  <li><code>CP862</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Hebrew language.
+  <li><code>CP862-IBM</code>, an IBM variant of <code>CP862</code>.
+  <li><code>CP863</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set.
+  <li><code>CP863-IBM</code>, an IBM variant of <code>CP863</code>.
+  <li><code>CP864</code>, a DOS oldie,
+      meant to be suitable for the Arabic language.
+  <li><code>CP864-IBM</code>, an IBM variant of <code>CP864</code>.
+  <li><code>CP865</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for some Nordic languages.
+  <li><code>CP865-IBM</code>, an IBM variant of <code>CP865</code>.
+  <li><code>CP866</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Russian language.
+  <li><code>CP869</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Greek language.
+  <li><code>CP869-IBM</code>, an IBM variant of <code>CP869</code>.
+  <li><code>CP874</code>, a DOS oldie,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Thai language.
+  <li><code>CP874-IBM</code>, an IBM variant of <code>CP874</code>.
+  <li><code>WINDOWS-1250</code> = <code>CP1250</code>,
+      a platform specific extension of the ASCII character set,
+      heavily incompatible with ISO-8859-2.
+  <li><code>WINDOWS-1251</code> = <code>CP1251</code>,
+      a platform specific extension of the ASCII character set,
+      heavily incompatible with ISO-8859-5,
+      meant to be suitable for the Russian language.
+  <li><code>WINDOWS-1252</code> = <code>CP1252</code>,
+      a platform specific extension of the ISO-8859-1 character set.
+  <li><code>WINDOWS-1253</code> = <code>CP1253</code>,
+      a platform specific extension of the ASCII character set,
+      gratuitously incompatible with ISO-8859-7,
+      meant to be suitable for the Greek language.
+  <li><code>WINDOWS-1254</code> = <code>CP1254</code>,
+      a platform specific extension of the ISO-8859-9 character set.
+  <li><code>WINDOWS-1255</code> = <code>CP1255</code>,
+      a platform specific extension of the ASCII character set,
+      gratuitously incompatible with ISO-8859-8,
+      meant to be suitable for the Hebrew language.
+  <li><code>WINDOWS-1256</code> = <code>CP1256</code>,
+      a platform specific extension of the ASCII character set,
+      meant to be suitable for the Arabic language.
+  <li><code>WINDOWS-1257</code> = <code>CP1257</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>WINDOWS-1258</code> = <code>CP1258</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>HP-ROMAN8</code>,
+      a platform specific extension of the ASCII character set.
+  <li><code>NEXTSTEP</code>,
+      a platform specific extension of the ASCII character set.
+<!-- #ifdef GNU_LIBICONV -->
+  <li><code>EUC-JP</code>,
+      a multibyte character set for the Japanese language.
+  <li><code>SHIFT-JIS</code>,
+      a multibyte character set for the Japanese language.
+  <li><code>CP932</code>,
+      a Microsoft variant of <code>SHIFT-JIS</code>.
+  <li><code>ISO-2022-JP</code>,
+      a stateful 7-bit multibyte character set for the Japanese language.
+  <li><code>ISO-2022-JP-2</code>,
+      a stateful 7-bit multibyte character set for the Japanese language.
+  <li><code>ISO-2022-JP-1</code>,
+      a stateful 7-bit multibyte character set for the Japanese language.
+  <li><code>EUC-CN</code>,
+      a multibyte character set for simplified Chinese.
+  <li><code>HZ</code>,
+      a stateful 7-bit multibyte character set for simplified Chinese.
+  <li><code>GBK</code>,
+      a multibyte character set for Chinese,
+  <li><code>CP936</code>,
+      a Microsoft variant of <code>GBK</code>.
+  <li><code>EUC-TW</code>,
+      a multibyte character set for traditional Chinese.
+  <li><code>BIG5</code>,
+      a multibyte character set for traditional Chinese.
+  <li><code>CP950</code>,
+      a Microsoft variant of <code>BIG5</code>.
+  <li><code>ISO-2022-CN</code>,
+      a stateful 7-bit multibyte character set for Chinese.
+  <li><code>ISO-2022-CN-EXT</code>,
+      a stateful 7-bit multibyte character set for Chinese.
+  <li><code>EUC-KR</code>,
+      a multibyte character set for Korean.
+  <li><code>CP949</code>,
+      a Microsoft variant of <code>EUC-KR</code>.
+  <li><code>ISO-2022-KR</code>,
+      a stateful 7-bit multibyte character set for Korean.
+  <li><code>ARMSCII-8</code>,
+      an extension of the ASCII character set, suitable for Armenian.
+  <li><code>GEORGIAN-ACADEMY</code>,
+      an extension of the ASCII character set, suitable for Georgian.
+  <li><code>GEORGIAN-PS</code>,
+      an extension of the ASCII character set, suitable for Georgian.
+  <li><code>TIS-620</code>,
+      an extension of the ASCII character set, suitable for Thai.
+  <li><code>MULELAO-1</code>,
+      an extension of the ASCII character set, suitable for Laotian.
+  <li><code>CP1133</code>,
+      an extension of the ASCII character set, suitable for Laotian.
+  <li><code>VISCII</code>,
+      an extension of the ASCII character set, suitable for Vietnamese.
+  <li><code>TCVN</code>,
+      an extension of the ASCII character set, suitable for Vietnamese.
+<!-- #endif /* GNU_LIBICONV */ -->
+</ul>
+
+<!-- #ifdef HAVE_ICONV -->
+<!--
+<dl>
+<dt><a name="iconv"></a><em>Platform dependent: Only on
+    <strong>Unix</strong> systems having the C library function
+    <strong>iconv()</strong>.</em>
+<dd>
+The character sets provided by the library function iconv() can also
+be used as encodings. To create such an encoding, call
+<code>make-encoding</code> with the character set name (a string) as
+<code>:charset</code> argument.
+
+<p>These encodings are not assigned to global variables, since there
+is no portable way to get the list of all character sets supported
+by iconv().
+
+<p>On Linux and GNU systems, you get this list by calling
+the <em>program</em> iconv: <code>iconv --list</code>. GNU glibc-2.1
+supports in particular, among others:
+<ul>
+  <li><code>EUC-JP</code> and <code>SHIFT-JIS</code>, for the Japanese
+      language,
+  <li><code>EUC-CN</code>, <code>EUC-TW</code>, <code>BIG5</code> and
+      <code>GB</code>, for the Chinese language,
+  <li><code>EUC-KR</code> and <code>ISO-2022-KR</code>, for the Korean
+      language.
+</ul>
+<p>HP-UX systems support in particular, among others:
+<ul>
+  <li><code>eucJP</code> and <code>sjis</code>, for the Japanese language,
+  <li><code>eucTW</code>, <code>big5</code> and <code>chinese-gb</code>, for
+      the Chinese language,
+  <li><code>eucKR</code>, for the Korean language.
+</ul>
+<p>AIX 4.2 systems support in particular, among others:
+<ul>
+  <li><code>IBM-eucJP</code>, for the Japanese language,
+  <li><code>IBM-eucTW</code>, for the Chinese language,
+  <li><code>IBM-eucKR</code>, for the Korean language.
+</ul>
+<p>On Solaris systems, you can forget about iconv-based encodings, because
+all the possible encodings are already built-in. (Solaris knows about
+Japanese, Chinese and Korean encodings, but can convert them only to/from
+UTF-8, not to/from UCS-2, which is CLISP's internal encoding.)
+<p>On IRIX systems, you can forget about iconv-based encodings as well,
+because all the interesting possible encodings are already built-in.
+<p>On OSF/1 systems, iconv-based encodings are not usable at all.
+<p>When an encoding is available as a built-in (see the list above) and
+through iconv(), the built-in is preferred, because it is more efficient
+and available across platforms.
+</dl>
+-->
+<!-- #endif /* HAVE_ICONV */ -->
+
+<!-- #endif /* UNICODE */ -->
+</dl>
+
+<a name="newline"></a><h4>Line Terminators</h4>
+
+<p>The line terminator mode can be one of the following three keywords:
+<table border=1>
+ <tr><th><code>:unix</code>
+     <td>Newline is represented by the ASCII LF character (U000A).
+ <tr><th><code>:mac</code>
+     <td>Newline is represented by the ASCII CR character (U000D).
+ <tr><th><code>:dos</code>
+     <td>Newline is represented by ASCII CR followed by ASCII LF.
+</table>
+Windows programs typically use the <code>:dos</code> line terminator,
+sometimes they also accept <code>:unix</code> line terminators or produce
+<code>:mac</code> line terminators.
+
+<p>The line terminator mode is relevant only for output (writing to a file,
+pipe or socket). During input, all three kinds of line terminators are
+recognized. If you do not want this, i.e., if you really want to distinguish
+LF, CR and CR/LF, you have to resort to binary input (function
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-byte.html"><code>read-byte</code></a>).
+
+<p>See also <a href="#clhs-newline">13.1.8 Treatment of Newline during
+Input and Output</a>.
+
+<h4>lisp:make-encoding</h4>
+
+<p>The function <code>(<strong>lisp:make-encoding</strong> &amp;key
+                       :charset :line-terminator
+                       :input-error-action :output-error-action)</code>
+returns an encoding. The <code>:charset</code> argument may be an
+encoding, a string, or <code>:default</code>.  The possible values for
+the <code>:line-terminator</code> argument are the keywords
+<code>:unix</code>, <code>:mac</code>, <code>:dos</code>.
+
+<p>The <code>:input-error-action</code> specifies what happens when an
+invalid byte sequence is encountered while converting bytes to characters.
+Its value can be <code>:error</code>, <code>:ignore</code> or a character
+to be used instead. The Unicode character #\uFFFD is typically used to
+indicate an error in the input sequence.
+
+<p>The <code>:output-error-action</code> specifies what happens when an
+invalid character is encountered while converting characters to bytes.
+Its value can be <code>:error</code>, <code>:ignore</code>, a byte to
+be used instead, or a character to be used instead. The Unicode character
+#\uFFFD can be used here only if it is encodable in the character set.
+
+<p>Encodings are types.  As such, they represent the set of characters
+encodable in the character set.  In this context, the way characters are
+translated into raw bytes is ignored, and the line terminator mode is
+ignored as well. <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_typep.html"><code>typep</code></a>
+and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_subtypep.html"><code>subtypep</code></a> can
+be used on encodings.
+
+<p>Besides every <a href="#open">file</a>/<a href="#pipe">pipe</a>/<a
+href="#socket">socket</a> stream containing an encoding, the following
+symbol-macro places contain global encodings:
+
+<a name="def-file-enc"></a>
+<p><code><strong>lisp:*default-file-encoding*</strong></code> is the
+encoding used for new <a href="#open">file</a>/<a
+href="#pipe">pipe</a>/<a href="#socket">socket</a> streams, when no
+<code><a href="#extfmt">:external-format</a></code> argument was
+specified.
+
+<!-- #ifdef UNICODE -->
+<dl>
+<dt><em>Platform dependent: Only in CLISP built <strong>with</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+<dl><dt><code><strong>lisp:*pathname-encoding*</strong></code>
+ <dd>is the encoding used for pathnames in the file system. Normally,
+ this is a 1:1 encoding.
+ Its <a href="#newline">line terminator</a> mode is ignored.
+<dt><code><strong>lisp:*terminal-encoding*</strong></code>
+ <dd>is the encoding used for communication with the terminal, in
+ particular by <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+ <code>*terminal-io*</code></a>.
+<dt><code><strong>lisp:*misc-encoding*</strong></code>
+ <dd>is the encoding used for access to environment variables, command
+ line options, and the like.
+ Its <a href="#newline">line terminator</a> mode is ignored.
+</dl>
+</dl>
+<!-- #endif -->
+
+
+<a name="gstream"></a><h3>Extensions-1.5. Defining new kinds of Streams</h3>
+
+<p>Two mechanisms are supported for creating new streams with
+user-defined behavior:
+<ul>
+  <li>You can create a new subclass of <code>lisp:fundamental-stream</code>
+      and define methods for the elementary stream operations on it.
+      These generic functions all have a name starting with the prefix
+      "stream-".
+  <li>You can create a new subclass of
+      <code>lisp:generic-stream-controller</code>
+      and define methods for the elementary stream operations on it.
+      These generic functions all have a name starting with the prefix
+      "generic-stream-". The stream itself is a different object, created
+      using the function <code>lisp:make-generic-stream</code>.
+</ul>
+<p>The <code>fundamental-stream</code> API is based on a proposal by
+David N Gray and is supported by most Common Lisp implementations
+currently in use. The <code>generic-stream-controller</code> API is
+CLISP specific and is now obsolete.
+
+<h4>Gray streams</h4>
+
+<p>This interface permits the definition of new classes of streams, and
+to program their behavior by defining methods for the elementary stream
+operations. It is based on a proposal of David N Gray to X3J13,
+available from <a
+href="ftp://parcftp.xerox.com/pub/cl/cleanup/mail/stream-definition-by-user.mail">ftp://parcftp.xerox.com/pub/cl/cleanup/mail/stream-definition-by-user.mail</a>.
+
+<p>All symbols defined by this interface, starting with the prefix
+"fundamental-" or "stream-", are exported from the package "LISP".
+
+<p>The following classes are defined.
+<dl>
+  <dt><code><strong>fundamental-stream</strong></code>
+    <dd>This is a superclass of all user-defined streams. It is a subclass of
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_stream.html">
+        <code>stream</code></a> and of
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/cla_standard-object.html">
+        <code>standard-object</code></a>.  Its metaclass is
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_standard-class.html">
+        <code>standard-class</code></a>.
+  <dt><code><strong>fundamental-input-stream</strong></code>
+    <dd>This is a superclass of all user-defined input streams. It is a
+        subclass of <code>fundamental-stream</code>. The built-in function
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_input-str_put-stream-p.html">
+        <code>input-stream-p</code></a> returns true on instances of
+        this class.  This means that when you define a new stream class
+        capable of doing input, you have to make it a subclass of
+        <code>fundamental-input-stream</code>.
+  <dt><code><strong>fundamental-output-stream</strong></code>
+    <dd>This is a superclass of all user-defined output streams. It is a
+        subclass of <code>fundamental-stream</code>. The built-in function
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_input-str_put-stream-p.html">
+        <code>output-stream-p</code></a> returns true on instances of
+        this class.  This means that when you define a new stream class
+        capable of doing output, you have to make it a subclass of
+        <code>fundamental-output-stream</code>.
+  <dt><code><strong>fundamental-character-stream</strong></code>
+    <dd>This is a superclass of all user-defined streams whose element-type is
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+        <code>character</code></a>.  It is a subclass of
+        <code>fundamental-stream</code>. It defines a method on
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+        <code>stream-element-type</code></a> that returns
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+        <code>character</code></a>.
+  <dt><code><strong>fundamental-binary-stream</strong></code>
+    <dd>This is a superclass of all user-defined streams whose element-type is
+        a subtype of <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html">
+        <code>integer</code></a>.  It is a subclass of
+        <code>fundamental-stream</code>.  When you define a subclass of
+        <code>fundamental-binary-stream</code>, you have to provide a
+        method on <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">
+        <code>stream-element-type</code></a>.
+  <dt><code><strong>fundamental-character-input-stream</strong></code>
+    <dd>This is a convenience class inheriting from both
+        <code>fundamental-character-stream</code> and
+        <code>fundamental-input-stream</code>.
+  <dt><code><strong>fundamental-character-output-stream</strong></code>
+    <dd>This is a convenience class inheriting from both
+        <code>fundamental-character-stream</code> and
+        <code>fundamental-output-stream</code>.
+  <dt><code><strong>fundamental-binary-input-stream</strong></code>
+    <dd>This is a convenience class inheriting from both
+        <code>fundamental-binary-stream</code> and
+        <code>fundamental-input-stream</code>.
+  <dt><code><strong>fundamental-binary-output-stream</strong></code>
+    <dd>This is a convenience class inheriting from both
+        <code>fundamental-binary-stream</code> and
+        <code>fundamental-output-stream</code>.
+</dl>
+
+<p>The following are general generic functions defined on streams.
+<dl>
+  <dt><code>(<strong><a
+      href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_stream-element-type.html">stream-element-type</a></strong>
+      <var>stream</var>)</code>
+    <dd>Returns the stream's element type, normally a subtype of
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+        <code>character</code></a> or
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html">
+        <code>integer</code></a>.
+        <br> The method for <code>fundamental-character-stream</code>
+        returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+        <code>character</code></a>.
+  <dt><code>(<strong>(setf stream-element-type)</strong>
+             <var>new-element-type</var> <var>stream</var>)</code>
+    <dd>Changes the stream's element type.
+        <br>The default method signals an error.
+        <br>This function is a CLISP extension.
+  <dt><code>(<strong><a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_close.html">close</a></strong>
+             <var>stream</var> &amp;key :abort)</code>
+    <dd>Closes the stream and flushes any associated buffers.
+        <br>When you define a primary method on this function, don't forget to
+        <code>(call-next-method)</code>.
+  <dt><code>(<strong><a
+      href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open-stream-p.html">open-stream-p</a></strong>
+      <var>stream</var>)</code>
+    <dd>Returns true before the stream has been closed, and
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+        after the stream has been closed.
+        <br>You don't need to add methods to this function.
+</dl>
+
+<p>The following are generic functions for character input.
+<dl>
+  <dt><code>(<strong>stream-read-char</strong> <var>stream</var>)</code>
+    <dd>If a character was pushed back using <code>stream-unread-char</code>,
+        returns and consumes it. Otherwise returns and consumes the next
+        character from the stream. Returns <code>:eof</code> if the
+        end-of-stream is reached.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-unread-char</strong>
+             <var>stream</var> <var>character</var>)</code>
+    <dd>Pushes <var>character</var>, which must be the last character read
+        from the stream, back onto the front of the stream.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-read-char-no-hang</strong>
+             <var>stream</var>)</code>
+    <dd>Returns a character or <code>:eof</code>, like
+        <code>stream-read-char</code>, if that would return immediately. If
+        <code>stream-read-char</code>'s value is not available immediately,
+        returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+        instead of waiting.
+        <br>The default method simply calls <code>stream-read-char</code>;
+        this is sufficient for streams whose <code>stream-read-char</code>
+        method never blocks.
+  <dt><code>(<strong>stream-peek-char</strong> <var>stream</var>)</code>
+    <dd>If a character was pushed back using <code>stream-unread-char</code>,
+        returns it. Otherwise returns the next character from the stream,
+        avoiding any side effects <code>stream-read-char</code> would do.
+        Returns <code>:eof</code> if the end-of-stream is reached.
+        <br>The default method calls <code>stream-read-char</code> and
+        <code>stream-unread-char</code>; this is sufficient for streams
+        whose <code>stream-read-char</code> method has no side-effects.
+  <dt><code>(<strong>stream-listen</strong> <var>stream</var>)</code>
+    <dd>If a character was pushed back using <code>stream-unread-char</code>,
+        returns it. Otherwise returns the next character from the stream,
+        if already available. If no character is available immediately, or if
+        end-of-stream is reached, returns
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+        <br>The default method calls <code>stream-read-char-no-hang</code>
+        and <code>stream-unread-char</code>; this is sufficient for streams
+        whose <code>stream-read-char</code> method has no side-effects.
+  <dt><code>(<strong>stream-read-char-will-hang-p</strong>
+             <var>stream</var>)</code>
+    <dd>Returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+        if <code>stream-read-char</code> will return immediately. Otherwise
+        it returns true.
+        <br>The default method calls <code>stream-read-char-no-hang</code>
+        and <code>stream-unread-char</code>; this is sufficient for streams
+        whose <code>stream-read-char</code> method has no side-effects.
+        <br>This function is a CLISP extension.
+  <dt><code>(<strong>stream-read-char-sequence</strong> <var>stream</var>
+             <var>sequence</var> &amp;optional
+             [<var>start</var> [<var>end</var>]])</code>
+    <dd>Fills the subsequence of <var>sequence</var> specified by
+        <code><var>:start</var></code> and <code><var>:end</var></code> with
+        characters consecutively read from <var>stream</var>. Returns the
+        index of the first element of <var>sequence</var> that was not
+        updated (= <var>end</var> or &lt; <var>end</var> if the stream
+        reached its end).
+        <br><var>sequence</var> is an array of characters, i.e. a string.
+        <var>start</var> is a nonnegative integer and default to 0.
+        <var>end</var> is a nonnegative integer or <code>nil</code> and
+        defaults to <code>nil</code>, which stands for
+        <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_length.html">length</a>
+               <var>sequence</var>)</code>.
+        <br>The default method repeatedly calls <code>stream-read-char</code>;
+        this is always sufficient if speed does not matter.
+        <br>This function is a CLISP extension.
+  <dt><code>(<strong>stream-read-line</strong> <var>stream</var>)</code>
+    <dd>Reads a line of characters, and return two values: the line (a string,
+        without the terminating <code>#\Newline</code> character), and a
+        boolean value which is true if the line was terminated by end-of-stream
+        instead of <code>#\Newline</code>.
+        <br>The default method repeatedly calls <code>stream-read-char</code>;
+        this is always sufficient.
+  <dt><code>(<strong>stream-clear-input</strong> <var>stream</var>)</code>
+    <dd>Clears all pending interactive input from the stream, and returns true
+        if some pending input was removed.
+        <br>The default method does nothing and returns <code>nil</code>; this
+        is sufficient for non-interactive streams.
+</dl>
+The following are generic functions for character output.
+<dl>
+  <dt><code>(<strong>stream-write-char</strong>
+             <var>stream</var> <var>character</var>)</code>
+    <dd>Writes <var>character</var>.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-line-column</strong> <var>stream</var>)</code>
+    <dd>Returns the column number where the next character would be written
+        (0 stands for the first column), or
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> if
+        that is not meaningful for this stream.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-start-line-p</strong> <var>stream</var>)</code>
+    <dd>Returns true if the next character would be written at the start of
+        a new line.
+        <br>The default method calls <code>stream-line-column</code> and
+        compares its result with 0; this is sufficient for streams whose
+        <code>stream-line-column</code> never returns
+        <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+  <dt><code>(<strong>stream-write-char-sequence</strong> <var>stream</var>
+             <var>sequence</var> &amp;optional
+             [<var>start</var> [<var>end</var>]])</code>
+    <dd>Outputs the subsequence of <var>sequence</var> specified by
+        <code><var>:start</var></code> and <code><var>:end</var></code> to
+        <var>stream</var>.
+        <br><var>sequence</var> is an array of characters, i.e. a string.
+        <var>start</var> is a nonnegative integer and default to 0.
+        <var>end</var> is a nonnegative integer or <code>nil</code> and
+        defaults to <code>nil</code>, which stands for
+        <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_length.html">length</a>
+               <var>sequence</var>)</code>.
+        <br>The default method repeatedly calls <code>stream-write-char</code>;
+        this is always sufficient if speed does not matter.
+        <br>This function is a CLISP extension.
+  <dt><code>(<strong>stream-write-string</strong> <var>stream</var>
+             <var>string</var> &amp;optional
+             [<var>start</var> [<var>end</var>]])</code>
+    <dd>Outputs the subsequence of <var>string</var> specified by
+        <code><var>:start</var></code> and <code><var>:end</var></code> to
+        <var>stream</var>. Returns <var>string</var>.
+        <br><var>string</var> is a string.
+        <var>start</var> is a nonnegative integer and default to 0.
+        <var>end</var> is a nonnegative integer or <code>nil</code> and
+        defaults to <code>nil</code>, which stands for
+        <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_length.html">length</a>
+               <var>string</var>)</code>.
+        <br>The default method calls <code>stream-write-char-sequence</code>;
+        this is always sufficient.
+  <dt><code>(<strong>stream-terpri</strong> <var>stream</var>)</code>
+    <dd>Outputs a <code>#\Newline</code> character.
+        <br>The default method calls <code>stream-write-char</code>;
+        this is always sufficient.
+  <dt><code>(<strong>stream-fresh-line</strong> <var>stream</var>)</code>
+    <dd>Possibly outputs a <code>#\Newline</code> character, so as to ensure
+        that the next character would be written at the start of a new line.
+        Returns true if it did output a <code>#\Newline</code> character.
+        <br>The default method calls <code>stream-start-line-p</code> and
+        then <code>stream-terpri</code> if necessary; this is always
+        sufficient.
+  <dt><code>(<strong>stream-finish-output</strong> <var>stream</var>)</code>
+    <dd>Ensures that any buffered output has reached its destination, and
+        then returns.
+        <br>The default method does nothing.
+  <dt><code>(<strong>stream-force-output</strong> <var>stream</var>)</code>
+    <dd>Brings any buffered output on its way towards its destination, and
+        returns without waiting until it has reached its destination.
+        <br>The default method does nothing.
+  <dt><code>(<strong>stream-clear-output</strong> <var>stream</var>)</code>
+    <dd>Attempts to discard any buffered output which has not yet
+        reached its destination.
+        <br>The default method does nothing.
+  <dt><code>(<strong>stream-advance-to-column</strong>
+             <var>stream</var> <var>column</var>)</code>
+    <dd>Ensures that the next character will be written at
+        <var>column</var> at least.
+        <br>The default method outputs an appropriate amount of space
+        characters; this is sufficient for non-proportional output.
+</dl>
+The following are generic functions for binary input.
+<dl>
+  <dt><code>(<strong>stream-read-byte</strong> <var>stream</var>)</code>
+    <dd>Returns and consumes the next integer from the stream. Returns
+        <code>:eof</code> if the end-of-stream is reached.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-read-byte-sequence</strong> <var>stream</var>
+             <var>sequence</var> &amp;optional
+             [<var>start</var> [<var>end</var>]])</code>
+    <dd>Fills the subsequence of <var>sequence</var> specified by
+        <code><var>:start</var></code> and <code><var>:end</var></code> with
+        integers consecutively read from <var>stream</var>. Returns the
+        index of the first element of <var>sequence</var> that was not
+        updated (= <var>end</var> or &lt; <var>end</var> if the stream
+        reached its end).
+        <br><var>sequence</var> is an array of integers.
+        <var>start</var> is a nonnegative integer and default to 0.
+        <var>end</var> is a nonnegative integer or <code>nil</code> and
+        defaults to <code>nil</code>, which stands for
+        <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_length.html">length</a>
+               <var>sequence</var>)</code>.
+        <br>The default method repeatedly calls <code>stream-read-byte</code>;
+        this is always sufficient if speed does not matter.
+        <br>This function is a CLISP extension.
+</dl>
+The following are generic functions for binary output.
+<dl>
+  <dt><code>(<strong>stream-write-byte</strong>
+             <var>stream</var> <var>integer</var>)</code>
+    <dd>Writes <var>integer</var>.
+        <br>You must define a method for this function.
+  <dt><code>(<strong>stream-write-byte-sequence</strong> <var>stream</var>
+             <var>sequence</var> &amp;optional
+             [<var>start</var> [<var>end</var>]])</code>
+    <dd>Outputs the subsequence of <var>sequence</var> specified by
+        <code><var>:start</var></code> and <code><var>:end</var></code> to
+        <var>stream</var>.
+        <br><var>sequence</var> is an array of integers.
+        <var>start</var> is a nonnegative integer and default to 0.
+        <var>end</var> is a nonnegative integer or <code>nil</code> and
+        defaults to <code>nil</code>, which stands for
+        <code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_length.html">length</a>
+               <var>sequence</var>)</code>.
+        <br>The default method repeatedly calls <code>stream-write-byte</code>;
+        this is always sufficient if speed does not matter.
+        <br>This function is a CLISP extension.
+</dl>
+
+
+<!-- #ifdef GENERIC_STREAMS -->
+<h4>Generic streams</h4>
+
+<p>This interface is CLISP specific and now obsolete. Please use the
+Gray streams interface instead.
+
+<p>Generic streams are user programmable streams. The programmer interface:
+<dl>
+  <dt><code>(<strong>lisp:make-generic-stream</strong>
+   <var>controller</var>)</code>
+  <dd>returns a generic stream.
+
+  <dt><code>(<strong>lisp:generic-stream-controller</strong>
+     <var>stream</var>)</code>
+   <dd>returns a private object to which generic stream methods dispatch.
+     The typical usage is to retrieve the object originally provided by the
+     user in <code>lisp:make-generic-stream</code>.
+
+  <dt><code>(<strong>lisp:generic-stream-p</strong>
+    <var>stream</var>)</code>
+   <dd>determines whether a stream is a generic stream, returning
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a> if it is,
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> otherwise.
+</dl>
+
+<p>In order to specify the behavior of a generic stream, the user must
+define CLOS methods on the following CLOS generic functions. The
+function <code>generic-stream-<var>xyz</var></code> corresponds to the
+Common Lisp function <code><var>xyz</var></code>. They all take a
+controller and some number of arguments.
+
+<dl>
+  <dt><code>(<strong>lisp:generic-stream-read-char</strong>
+             <var>controller</var>)</code>
+   <dd> Returns and consumes the next character,
+    <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> at
+    end of file. Takes one argument, the controller object.
+  <dt><code>(<strong>lisp:generic-stream-peek-char</strong>
+             <var>controller</var>)</code>
+   <dd> Returns the next character,
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a> at end of file. A
+   second value indicates whether the side effects associated with
+   consuming the character were executed:
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+   <code>t</code></a> means that a full
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_read-char.html">
+   <code>read-char</code></a> was done,
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a> means that no side effects were done. Takes one
+   argument, the controller object.
+  <dt><code>(<strong>lisp:generic-stream-read-byte</strong>
+             <var>controller</var>)</code>
+   <dd> Returns and consumes the next integer,
+       <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+       <code>nil</code></a> at end of file.
+       Takes one argument, the controller object.
+  <dt><a name="generic-stream-read-char-will-hang-p"></a>
+      <code>(<strong>lisp:generic-stream-read-char-will-hang-p</strong>
+             <var>controller</var>)</code>
+  <dd> This generic function is used to query the stream's input status.
+    It returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+    if <code>lisp:generic-stream-read-char</code> and
+    <code>lisp:generic-stream-peek-char</code> will certainly return
+    immediately. Otherwise it returns true.
+  <dt><code>(<strong>lisp:generic-stream-write-char</strong>
+             <var>controller</var> <var>ch</var>)</code>
+    <dd> First argument is the controller object.
+         Second argument is the character to be written.
+  <dt><code>(<strong>lisp:generic-stream-write-byte</strong>
+             <var>controller</var> <var>by</var>)</code>
+    <dd> First argument is the controller object.
+         Second argument is the integer to be written.
+  <dt><code>(<strong>lisp:generic-stream-write-string</strong>
+            <var>controller</var> <var>string</var> <var>start</var>
+            <var>len</var>)</code>
+   <dd> Called with argument list <code>(<var>controller</var>
+     <var>string</var> <var>start</var> <var>len</var>)</code>, this
+     function shall write <code>(subseq (the string <var>string</var>)
+     <var>start</var> (+ <var>start</var> <var>len</var>))</code>
+     First argument is the controller object.
+  <dt><code>(<strong>lisp:generic-stream-clear-input</strong>
+             <var>controller</var>)</code>
+  <dt><code>(<strong>lisp:generic-stream-clear-output</strong>
+             <var>controller</var>)</code>
+  <dt><code>(<strong>lisp:generic-stream-finish-output</strong>
+             <var>controller</var>)</code>
+  <dt><code>(<strong>lisp:generic-stream-force-output</strong>
+             <var>controller</var>)</code>
+  <dt><code>(<strong>lisp:generic-stream-close</strong>
+             <var>controller</var>)</code>
+    <dd> Take one argument, the controller object.
+</dl>
+<!-- #endif -->
+
+
+<a name="weak"></a><h3>Extensions-1.6. Weak Pointers</h3>
+
+<p>A weak pointer is an object holding a reference to a given object,
+without keeping the latter from being garbage-collected.
+
+<p><code>(<strong>lisp:make-weak-pointer</strong> <var>value</var>)</code>
+returns a fresh weak pointer referring to <var>value</var>.
+
+<p><code>(<strong>lisp:weak-pointer-p</strong> <var>object</var>)</code>
+returns true if the <var>object</var> is of type
+<code><strong>weak-pointer</strong></code>.
+
+<p><code>(<strong>lisp:weak-pointer-value</strong>
+<var>weak-pointer</var>)</code> returns two values: The original value
+and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a>, if the value has not yet been garbage collected,
+else <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> and <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>.
+
+
+<a name="final"></a><h3>Extensions-1.7. Finalization</h3>
+
+<p>Calling <code>(<strong>lisp:finalize</strong> <var>object</var>
+<var>function</var>)</code> has the effect that when the specified
+object is being garbage collected, <code>(funcall <var>function</var>
+<var>object</var>)</code> will be executed.
+
+<p>Calling <code>(lisp:finalize <var>object</var> <var>function</var>
+<var>guardian</var>)</code> has a similar effect, but only as long as
+the "guardian" has not been garbage collected: When
+<var>object</var> is being garbage collected,
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_funcall.html">funcall</a>
+<var>function</var> <var>object</var> <var>guardian</var>)</code> will
+be executed.  If the guardian is garbage collected before
+<var>object</var> is, nothing happens.
+
+<p>Note: The time when &#34;the <var>object</var> is being garbage
+collected&#34; is not defined deterministically. (Actually, it possibly
+never occurs.) It denotes a moment at which no references to
+<var>object</var> exist from other Lisp objects. When the
+<var>function</var> is called, <var>object</var> (and possibly
+<var>guardian</var>) enter the "arena of live Lisp objects" again.
+
+<p>No finalization request will be executed more than once.
+
+
+<a name="prompt"></a><h3>Extensions-1.8. The Prompt</h3>
+
+<p>The variable <code><strong>sys::*prompt*</strong></code> controls the
+appearance of the prompt.  When its value is a function, it is called
+and its value is printed with <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>princ</code></a>.  Otherwise, the value itself is printed with <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_writecm_p_rintcm_princ.html">
+<code>princ</code></a>.  The default value of <code>sys::*prompt*</code>
+prints &#34;<var>package[nn]</var>&gt;&nbsp;&#34; where
+<var>package</var> is the shortest (nick)name of the current package <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stpackagest.html"><code>*package*</code></a> if it
+is the same as it was in the beginning or if it does not contain symbol
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> (it is assumed that in the latter case you would want to
+keep in mind that your current package is something weird); and
+<var>nn</var> is the ordinal number of the current prompt (hopefully, it
+will remain finite).  To help you in constructing your own fancy
+prompts, two functions are provided:
+<code><strong>sys::prompt-new-package</strong></code>, returning <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stpackagest.html"><code>*package*</code></a> or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> if the current package is the same as it was initially;
+and <code><strong>sys::package-short-name</strong></code> taking one
+argument, a package, and returning its shortest name or nickname.  Also,
+a variable <code><strong>sys::*command-index*</strong></code> contains
+the current prompt number, it is your responsibility to increment it
+(this variable is bound to 0 before saving the image).
+
+
+<a name="ansi"></a><h3>Extensions-1.9. Maximum ANSI CL compliance</h3>
+
+A few ANSI CL features are turned off by default, because they would hurt
+in every-day use. They can be switched on, all at once by setting the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-symbol-macro.html">
+symbol-macro</a> <code><strong>lisp:*ansi*</strong></code> to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>,
+or they can be switched on individually. Setting
+<code>lisp:*ansi*</code> to
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>
+implies the following:
+   <ul>
+    <li>Setting <a
+      href="#pathprint"><code>lisp:*print-pathnames-ansi*</code></a> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a> for ANSI
+      CL compliant <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_pathname.html">
+      <code>pathname</code></a> printing.
+    <li>Setting
+      <code><strong>lisp:*coerce-fixnum-char-ansi*</strong></code> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>
+      so that <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_fixnum.html">
+      <code>fixnum</code></a>s cannot be
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_coerce.html">
+      <code>coerce</code></a>d to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+      <code>character</code></a>s (because a
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_fixnum.html">
+      <code>fixnum</code></a> is not a
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/glo_c.html#character_designator">
+      character designator</a> in ANSI CL.)
+    <li>Setting <a
+      href="#count-ansi"><code>lisp:*sequence-count-ansi*</code></a> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a> so that
+      negative <code>:count</code> keyword parameter is equivalent to
+      0 as per the <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss283.html">
+      RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER</a> ANSI CL Issue 283.
+    <li>Setting <a
+      href="#pathmerge"><code>lisp:*merge-pathnames-ansi*</code></a>
+      to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+    <li>Setting <a
+      href="#flocont"><code>lisp:*floating-point-contagion-ansi*</code></a>
+      to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>.
+    <li>Adding <code><strong>:ansi-cl</strong></code> to
+      <a href="#features"><code>*features*</code></a>.
+   </ul>
+   Please note that if you run CLISP with the <strong>-a</strong> switch
+   or set the <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-symbol-macro.html">
+   symbol-macro</a> <code><strong>lisp:*ansi*</strong></code> to
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a>
+   and <a href="#image">save image</a>, then all subsequent invocations
+   of CLISP with this image will be as if with <strong>-a</strong>
+   (regardless whether you actually supply the <strong>-a</strong>
+   switch).  You can always set the
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_define-symbol-macro.html">
+   symbol-macro</a> <code><strong>lisp:*ansi*</strong></code> to
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+   <code>nil</code></a>, reversing the above settings, i.e.,
+   <ul>
+    <li>Setting <a
+      href="#pathprint"><code>lisp:*print-pathnames-ansi*</code></a> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> for
+      readable <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_pathname.html">
+      <code>pathname</code></a> printing.
+    <li>Setting
+      <code><strong>lisp:*coerce-fixnum-char-ansi*</strong></code> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+      so that <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_fixnum.html">
+      <code>fixnum</code></a>s <strong>can</strong> be
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_coerce.html">
+      <code>coerce</code></a>d to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html">
+      <code>character</code></a>s
+      (via <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_code-char.html">
+      <code>code-char</code></a>).
+    <li>Setting <a
+      href="#count-ansi"><code>lisp:*sequence-count-ansi*</code></a> to
+      <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> to
+      signal an error on negative <code>:count</code> keyword parameter,
+      contrary to the <a href="http://www.harlequin.com/education/books/HyperSpec/Issues/iss283.html">
+      RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER</a> ANSI CL Issue 283.
+    <li>Setting <a
+      href="#pathmerge"><code>lisp:*merge-pathnames-ansi*</code></a>
+      to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+    <li>Setting <a
+      href="#flocont"><code>lisp:*floating-point-contagion-ansi*</code></a>
+      to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+    <li>Deleting <code><strong>:ansi-cl</strong></code> from
+      <a href="#features"><code>*features*</code></a>.
+   </ul>
+
+
+<a name="macros3"></a><h3>Extensions-1.10. Additional Fancy Macros</h3>
+
+<p>If you uncomment the <code>(load "macros3")</code> line in the file
+<code>"init.lsp"</code> before doing <code>make</code>, or load the file
+<code>"macros3"</code>into a running CLISP, you get access to the
+following macros:
+
+<dl>
+ <dt><a name="ethe"><code><strong>lisp:ethe</strong></code></a>
+  <dd><code>(lisp:ethe <var>value-type</var> <var>form</var>)</code>
+   enforces a type check in both interpreted and compiled code.
+ <dt><a name="letf"><code><strong>lisp:letf</strong></code> and
+     <code><strong>lisp:letf*</strong></code></a>
+  <dd>These macros are similar to
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_letcm_letst.html">
+   <code>let</code></a> and
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_letcm_letst.html">
+   <code>let*</code></a>, respectively, except that they
+   can bind places, even places with multiple values.  Example:
+   <dl>
+   <dt><code>(letf (((values a b) <var>form</var>)) ...)</code>
+   <dd>is equivalent to
+      <code>(multiple-value-bind (a b) <var>form</var> ...)</code>
+   <dt><code>(letf (((first l) 7)) ...)</code>
+   <dd>is approximately equivalent to
+    <pre><code>    (let* ((#:g1 l) (#:g2 (first #:g1)))
+      (unwind-protect (progn (setf (first #:g1) 7) ...)
+                      (setf (first #:g1) #:g2)))
+    </code></pre>
+   </dl>
+ <dt><a name="with-collect"><code><strong>lisp:with-collect</strong></code></a>
+  <dd>Similar to the <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_loop.html">
+   <code>loop</code></a>'s <code>collect</code> instruction, except that
+   it is more "Lispy" in appearance and can appear arbitrarily deep.  It
+   defines local macros (with
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_fletcm_scm_macrolet.html">
+   <code>macrolet</code></a>) which collect objects given to it in
+   lists, which are then returned as multiple values.  E.g.,
+   <pre><code>    (lisp:with-collect (c0 c1)
+      (dotimes (i 10) (if (oddp i) (c0 i) (c1 i))))
+   </code></pre>
+   returns two lists <code>(1 3 5 7 9)</code> and <code>(0 2 4 6 8)</code>
+   as multiple values.
+</dl>
+
+<p>You might want to add a <code>(load "macros3")</code> statement to
+your <a href="clisp.html#Option -norc"><code>".clisprc"</code></a> file if
+you do not want to dump your own image.
+
+
+<!-- #if defined(SCREEN) || defined(AMIGAOS) || defined(GRAPHICS) || defined(UNIX) || defined(DYNAMIC_FFI) || defined(SOCKET_STREAMS) -->
+
+<a name="platform"></a><h2>Extensions-2: Platform specific Extensions</h2>
+
+<!-- #if defined(SCREEN) || defined(AMIGAOS) -->
+<a name="screen"></a><h3>Extensions-2.1. Random Screen Access</h3>
+
+<em>Platform dependent: <strong>UNIX</strong>, <strong>DOS</strong>,
+    <strong>OS/2</strong>, <strong>Amiga</strong> platforms only.</em>
+
+<dl>
+ <dt><code>(<strong>screen:make-window</strong>)</code>
+ <dd>returns a "window stream". As long as this stream is open,
+  the terminal is in cbreak/noecho mode.  <a
+  href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+  <code>*terminal-io*</code></a> should not be used for input or output
+  during this time. (Use <a
+  href="#terminal"><code>lisp:with-keyboard</code></a> and
+  <a href="#terminal"><code>lisp:*keyboard-input*</code></a> instead.)
+
+ <dt><code>(<strong>screen:with-window</strong> . <var>body</var>)</code>
+  <dd>binds <code><strong>screen:*window*</strong></code> to a window
+  stream and executes <var>body</var>. The stream is
+  guaranteed to be closed when the body is left. During its execution,
+  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+  <code>*terminal-io*</code></a> should not be used, as above.
+
+ <dt><code>(<strong>screen:window-size</strong>
+            <var>window-stream</var>)</code>
+  <dd>  returns the window's size, as two values:
+  height (= y<sub>max</sub>+1) and width (= x<sub>max</sub>+1).
+
+ <dt><code>(<strong>screen:window-cursor-position</strong>
+            <var>window-stream</var>)</code>
+  <dd> returns the position of the cursor in the window, as two values:
+  line (&gt;=0, &lt;=y<sub>max</sub>, 0 means top), column (&gt;=0,
+  &lt;=x<sub>max</sub>, 0 means left margin).
+
+ <dt><code>(<strong>screen:set-window-cursor-position</strong>
+            <var>window-stream</var> <var>line</var> <var>column</var>)</code>
+  <dd>sets the position of the cursor in the window.
+
+ <dt><code>(<strong>screen:clear-window</strong>
+            <var>window-stream</var>)</code>
+  <dd>clears the window's contents and puts the cursor in the upper left
+      corner.
+
+  <dt><code>(<strong>screen:clear-window-to-eot</strong>
+             <var>window-stream</var>)</code>
+   <dd>clears the window's contents from the cursor position to the end
+       of window.
+
+ <dt><code>(<strong>screen:clear-window-to-eol</strong>
+            <var>window-stream</var>)</code>
+  <dd>clears the window's contents from the cursor position to the end
+      of line.
+
+ <dt><code>(<strong>screen:delete-window-line</strong>
+            <var>window-stream</var>)</code>
+  <dd>removes the cursor's line, moves the lines below it up by one line
+      and clears the window's last line.
+
+ <dt><code>(<strong>screen:insert-window-line</strong>
+            <var>window-stream</var>)</code>
+  <dd>inserts a line at the cursor's line, moving the lines below it
+      down by one line.
+
+ <dt><code>(<strong>screen:highlight-on</strong>
+            <var>window-stream</var>)</code>
+  <dd>switches highlighted output on.
+
+ <dt><code>(<strong>screen:highlight-off</strong>
+            <var>window-stream</var>)</code>
+  <dd>switches highlighted output off.
+
+ <dt><code>(<strong>screen:window-cursor-on</strong>
+            <var>window-stream</var>)</code>
+  <dd>makes the cursor visible, a cursor block in most implementations.
+
+ <dt><code>(<strong>screen:window-cursor-off</strong>
+            <var>window-stream</var>)</code>
+  <dd>makes the cursor invisible, in implementations where this is
+      possible.
+</dl>
+<!-- #endif -->
+
+<!-- #ifdef UNIX -->
+<a name="modules"></a><h3>Extensions-2.2. External Modules</h3>
+
+<em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+
+<p>CLISP has a facility for adding external modules (written in C, for
+example).  It is invoked through <code>clisp-link</code>.
+
+<p>A module is a piece of external code which defines extra Lisp
+objects, symbols and functions. A module name must consist of the
+characters A-Z,a-z,_,0-9. The module name <code>"clisp"</code>
+is reserved. Normally a module name is derived from the corresponding
+file name.
+
+<p><code>clisp-link</code> needs a directory containing:
+<table>
+  <tr><th>  <code>modules.d</code>
+  <tr><th>  <code>modules.c</code>
+  <tr><th>  <code>clisp.h</code>
+</table>
+<code>clisp-link</code> expects to find these files in a subdirectory
+<code>linkkit/</code> of the current directory. This can be overridden
+by the environment variable <code>CLISP_LINKKIT</code>.
+
+<p><code>clisp-link</code> operates on CLISP linking sets and on module sets.
+
+<p>A <strong>linking set</strong> is a directory containing:
+<dl>
+<dt><code>makevars</code>
+ <dd>some <code>/bin/sh</code> commands, setting the variables
+   <dl>
+    <dt><code>CC</code>       <dd>the C compiler
+    <dt><code>CFLAGS</code>   <dd>flags for the C compiler, when compiling
+    <dt><code>CLFLAGS</code>  <dd>flags for the C compiler, when linking
+    <dt><code>LIBS</code>     <dd>libraries to use when linking
+    <dt><code>X_LIBS</code>   <dd>additional X window system libraries to use
+    <dt><code>RANLIB</code>   <dd>the ranlib command
+    <dt><code>FILES</code>    <dd>the list of files needed when linking
+   </dl>
+ <dt><code>modules.h</code>
+  <dd>the list of modules contained in this linking set
+ <dt><code>modules.o</code>
+  <dd>the compiled list of modules contained in this linking set
+ <dt>all the <code>FILES</code> listed in <code>makevars</code>
+ <dt><code>lisp.run</code>     <dd>the executable
+ <dt><code>lispinit.mem</code> <dd>the memory image
+</dl>
+
+<p>To run a clisp contained in some linking set <var>dir</var>, call
+&#34;<code><var>dir</var>/lisp.run -M
+<var>dir</var>/lispinit.mem</code>&#34;.
+
+<p>A <strong>module set</strong> is a directory containing:
+<dl>
+<dt><code>link.sh</code>
+    <dd>some <code>/bin/sh</code> commands, which prepare the directory
+        before linking, and set the variables <code>NEW_FILES</code>,
+        <code>NEW_LIBS</code>, <code>NEW_MODULES</code>,
+        <code>TO_LOAD</code> and optionally <code>TO_PRELOAD</code>
+<dt>and any other files needed by <code>link.sh</code>.
+</dl>
+
+<p>Note that in <code>link.sh</code> the module set directory is
+referred to as <code>"$modulename"/</code>.
+<dl>
+<dt>The <code>NEW_FILES</code> variable <dd>shall contain a
+  space-separated list of files that belong to the module set and will
+  belong to every new linking set.
+
+<dt>The <code>NEW_LIBS</code> variable <dd>shall contain a
+  space-separated list of files or C compiler switches that need to be
+  passed to the C compiler when linking the lisp.run belonging to a new
+  linking set.
+
+<dt>The <code>NEW_MODULES</code> variable <dd>shall contain a
+  space-separated list of the module names belonging to the module
+  set. Normally, every <code>.c</code> file in the module set defines a
+  module of its own. The module name is derived from the file name.
+
+<dt>The <code>TO_LOAD</code> variable <dd>shall contain a
+  space-separated list of Lisp files to load before building the
+  <code>lispinit.mem</code> belonging to a new linking set.
+
+<dt>The <code>TO_PRELOAD</code> variable, if defined, <dd>shall contain
+  a space-separated list of Lisp files to load into an intermediate
+  <code>lispinit.mem</code> file, before building the
+  <code>lispinit.mem</code> belonging to a new linking set. This
+  variable is usually used for defining Lisp packages which must be
+  present when the new <code>.c</code> files are initialized.
+</dl>
+
+<p>The command &#34;<code>clisp-link create-module-set
+<var>module-dir</var> <var>file1.c</var> ...</code>&#34; creates a
+module set in <var>module-dir</var> which refers (via symbolic links) to
+<code><var>file1.c</var></code> etc. The files are expected to be
+modules of their own.
+
+<p>The command &#34;<code>clisp-link add-module-set
+<var>module-dir</var> <var>source-dir</var>
+<var>destination-dir</var></code>&#34; combines a linking set in
+<var>source-dir</var> and a module in <var>module-dir</var> to a new
+linking set, in a directory <var>destination-dir</var> which is newly
+created.
+
+<p>The command &#34;clisp-link run <var>source-dir</var>
+<var>module-dir</var> ...&#34; runs the linking set in
+<var>source-dir</var>, with the module in <var>module-dir</var> loaded.
+More than one module can be specified. If CLISP has been built with the
+configuration option <code>--with-dynamic-modules</code>, the loading
+will be performed through dynamic loading. Otherwise -- this is much
+slower -- a temporary linking set will be created and deleted
+afterwards. Note that dynamic loading does not work on all operating
+systems, and that <code>--with-dynamic-modules</code> precludes some
+efficiency optimizations which are on by default.
+
+<h4>Example</h4>
+
+<p>To link in the FFI bindings for the Linux operating system, the
+following steps are needed. (Step 1 and step 2 need not be executed in
+this order.)
+
+<ol>
+<li>Create a new module set:
+<pre><code>   $ clisp-link create-module-set linux /<var>somewhere</var>/bindings/linux.c
+</code></pre>
+   Modify the newly created <code>linux/link.sh</code> to add &#34;<code>-lm</code>&#34; to the libraries:
+<pre><code>   NEW_LIBS="$file_list"
+   --&gt;
+   NEW_LIBS="$file_list -lm"
+</code></pre>
+   Modify the newly created <code>linux/link.sh</code> to load <code>linux.fas</code> before saving
+   the memory image:
+<pre><code>   TO_LOAD=''
+   --&gt;
+   TO_LOAD='/<var>somewhere</var>/bindings/linux.fas'
+</code></pre>
+<li>Compile <code>linux.lsp</code>, creating <code>linux.c</code>:
+<pre><code>   $ clisp -c /<var>somewhere</var>/bindings/linux.lsp
+</code></pre>
+<li>Create a new linking set:
+<pre><code>   $ clisp-link add-module-set linux base base+linux
+</code></pre>
+<li>Run and try it:
+<pre><code>   $ base+linux/lisp.run -M base+linux/lispinit.mem
+   &gt; (linux::stat "/tmp")
+</code></pre>
+</ol>
+<!-- #endif -->
+
+<h4>Modules included in the distribution.</h4>
+
+<p>The following modules come with the distribution of
+<code>CLISP</code>:
+<dl>
+ <dt><strong>bindings</strong>
+  <dd>Call the operating system functions from <code>CLISP</code>.  The
+   following platforms are supported:
+   <ul>
+    <li>AmigaOS
+    <li>Linux/libc5
+    <li>Linux/libc6
+   </ul>
+ <dt><strong>CLX</strong>
+  <dd>Call Xlib functions from <code>CLISP</code>.  Two implementations
+   are supplied:
+   <ul>
+    <li>mit-clx, from MIT <!-- ftp://ftp.x.org/R5contrib/CLX.R5.02.tar.Z -->
+    <li>new-clx, by <a href="http://www.uni-karlsruhe.de/~unk6/">Gilbert
+    Baumann</a> <em><a
+    href="mailto:unk6@rz.uni-karlsruhe.de">unk6@rz.uni-karlsruhe.de</a></em>.
+   </ul>
+ <dt><strong>postgresql632</strong>, <strong>postgresql642</strong>
+  <dd>Access <a href="http://www.PostgreSQL.org/">PostgreSQL</a> from
+   <code>CLISP</code>.
+ <dt><strong>queens</strong>
+  <dd>Compute the number of solutions to the n-queens problem on a n*n
+   checkboard.
+ <dt><a name="regexp"><strong>regexp</strong></a>
+  <dd>The POSIX Regular Expressions matching, compiling, executing.
+
+   <p>The following code computes the number of people who use
+   a particular shell:
+<pre>
+<code>(use-package :regexp)
+(let ((h (make-hash-table :test #'equal :size 10)) (n 0))
+  (with-open-file (f "/etc/passwd")
+    (with-loop-split (s f ":")
+      (let ((sh (seventh s)))
+        (if (gethash sh h)
+            (incf (gethash sh h))
+            (setf (gethash sh h) 1)))))
+  (with-hash-table-iterator (i h)
+    (loop (multiple-value-bind (r k v) (i)
+            (unless r (return))
+            (format t "[~d] ~s~30t== ~5:d~%" (incf n) k v)))))</code></pre>
+
+  <p>The same is done by the following Perl:
+<pre>
+<code>#!/usr/local/bin/perl -w
+
+use diagnostics;
+use strict;
+
+my $IN = $ARGV[0];
+open(INF,"&lt; $IN") || die "$0: cannot read file [$IN]: $!\n;";
+my %hash;
+while (&lt;INF&gt;) {
+  chop;
+  my @all = split($ARGV[1]);
+  my $shell = ($#all &gt;= 6 ? $all[6] : "");
+  if ($hash{$shell}) { $hash{$shell} ++; }
+  else { $hash{$shell} = 1; }
+}
+my $ii = 0;
+for my $kk (keys(%hash)) {
+  print "[",++$ii,"] \"",$kk,"\"  --  ",$hash{$kk},"\n";
+}</code></pre>
+
+ <dt><strong>wildcard</strong>
+  <dd>Shell globbing
+</dl>
+
+
+<!-- #ifdef DYNAMIC_FFI -->
+<a name="dffi"></a><h3>Extensions-2.3. The Foreign Function Call Facility</h3>
+
+<em>Platform dependent: many <strong>UNIX</strong>,
+    <strong>Win32</strong> platforms only.</em>
+
+<p>A foreign function description is written as a Lisp file, and when
+compiled it produces a <code>.c</code> file which is then compiled by
+the C compiler and may be linked together with <code>lisp.a</code>.
+
+<p>All symbols relating to the foreign function interface are exported
+from the package FFI. To use them,
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_use-package.html">use-package</a>
+       "FFI")</code>.
+
+<p>Special FFI forms may appear anywhere in the Lisp file.
+
+<h4>Overview</h4>
+
+<p>These are the special FFI forms. We have taken a pragmatic approach:
+the only foreign languages we support for now are C and ANSI C.
+
+<p><code>(<strong>def-c-type</strong> <var>name</var>
+<var>c-type</var>)</code>
+
+<p><code>(<strong>def-c-var</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td> <code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td> <code>(:type <var>c-type</var>)</code>
+<tr><td align=right>    | <td> <code>(:read-only <var>boolean</var>)</code>
+<tr><td align=right>    | <td> <code>(:alloc <var>allocation</var>)</code>
+</table>
+
+<p><code>(<strong>def-call-out</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td> <code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td> <code>(:arguments {(<var>arg-name</var>
+                               <var>c-type</var> [<var>param-mode</var>
+                               [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td> <code>(:return-type <var>c-type</var>
+                               [<var>allocation</var>])</code>
+<tr><td align=right>    | <td> <code>(:language <var>language</var>)</code>
+</table>
+
+<p><code>(<strong>def-call-in</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td> <code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td> <code>(:arguments {(<var>arg-name</var>
+                                <var>c-type</var> [<var>param-mode</var>
+                                [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td> <code>(:return-type <var>c-type</var>
+                                [<var>allocation</var>])</code>
+<tr><td align=right>    | <td> <code>(:language <var>language</var>)</code>
+</table>
+
+<p><code>(<strong>def-c-call-out</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td> <code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td> <code>(:arguments {(<var>arg-name</var>
+                               <var>c-type</var> [<var>param-mode</var>
+                               [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td> <code>(:return-type <var>c-type</var>
+                              [<var>allocation</var>])</code>
+</table>
+
+<p><code>(<strong>def-c-call-in</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td> <code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td> <code>(:arguments {(<var>arg-name</var> <var>c-type</var> [<var>param-mode</var> [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td> <code>(:return-type <var>c-type</var> [<var>allocation</var>])</code>
+</table>
+
+<p><code>(<strong>def-c-struct</strong> <var>name</var>
+(<var>ident</var> <var>c-type</var>)*)</code>
+
+<p><code>(<strong>def-c-enum</strong> <var>name</var> {<var>ident</var>
+| (<var>ident</var> [<var>value</var>])}*)</code>
+
+<p><code>(<strong>c-lines</strong> <var>format-string</var>
+{<var>argument</var>}*)</code>
+
+<p><code>(<strong>element</strong> <var>c-place</var>
+{<var>index</var>}*)</code>
+
+<br>
+<code>(<strong>deref</strong> <var>c-place</var>)</code>
+<br>
+<code>(<strong>slot</strong> <var>c-place</var> <var>slot-name</var>)</code>
+<br>
+<code>(<strong>cast</strong> <var>c-place</var> <var>c-type</var>)</code>
+<p>
+<code>(<strong>typeof</strong> <var>c-place</var>)</code>
+<br>
+<code>(<strong>sizeof</strong> <var>c-place</var>)</code>, <code>(sizeof
+       <var>c-type</var>)</code>
+<br>
+<code>(<strong>bitsizeof</strong> <var>c-place</var>)</code>,
+<code>(bitsizeof <var>c-type</var>)</code>
+
+<p><code>(<strong>validp</strong> <var>foreign-entity</var>)</code>
+
+<p><var>name</var> is any Lisp symbol.
+
+<p><var>c-name</var> is a string.
+
+<h4>(Foreign) C types</h4>
+
+<p>Foreign C types are used in the FFI. They are <em>not</em> regular
+Common Lisp types or CLOS classes.
+
+<p>A <var>c-type</var> is either a predefined C type or the name of a
+type defined by <code>def-c-type</code>.
+
+<p>The simple C types are these:
+
+<table border=1>
+ <tr><th>Lisp name <th>Lisp equiv <th>C equiv <th>ILU equiv <th>Comment
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+     <td><code>void</code>
+     <td> <td>as a result type only
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_boolean.html"><code>boolean</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_boolean.html"><code>boolean</code></a>
+     <td><code>int</code>
+     <td><code>BOOLEAN</code>
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html_character.html">
+         <code>character</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_character.html_character.html">
+         <code>character</code></a>
+     <td><code>char</code>
+     <td><code>SHORT CHARACTER</code>
+ <tr><td><code>char</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>signed char</code>
+ <tr><td><code>uchar</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>unsigned char</code>
+ <tr><td><code>short</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>short</code>
+ <tr><td><code>ushort</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>unsigned short</code>
+ <tr><td><code>int</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>int</code>
+ <tr><td><code>uint</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>unsigned int</code>
+ <tr><td><code>long</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>long</code>
+ <tr><td><code>ulong</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html"><code>integer</code></a>
+     <td><code>unsigned long</code>
+ <tr><td><code>uint8</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                8)</code>
+     <td><code>uint8</code>
+     <td><code>BYTE</code>
+ <tr><td><code>sint8</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                8)</code>
+     <td><code>sint8</code>
+ <tr><td><code>uint16</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                16)</code>
+     <td><code>uint16</code>
+     <td><code>SHORT CARDINAL</code>
+ <tr><td><code>sint16</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                16)</code>
+     <td><code>sint16</code>
+     <td><code>SHORT INTEGER</code>
+ <tr><td><code>uint32</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                32)</code>
+     <td><code>uint32</code>
+     <td><code>CARDINAL</code>
+ <tr><td><code>sint32</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                32)</code>
+     <td><code>sint32</code>
+     <td><code>INTEGER</code>
+ <tr><td><code>uint64</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                64)</code>
+     <td><code>uint64</code>
+     <td><code>LONG CARDINAL</code>
+     <td>does not work on all platforms
+ <tr><td><code>sint64</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                64)</code>
+     <td><code>sint64</code>
+     <td><code>LONG INTEGER</code>
+     <td>does not work on all platforms
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+         <code>single-float</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+         <code>single-float</code></a>
+     <td><code>float</code>
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+         <code>double-float</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_short-flo_m_long-float.html">
+         <code>double-float</code></a>
+     <td><code>double</code>
+</table>
+
+<p>The predefined C types are:
+
+<table>
+<tr><td>  <var>c-type</var> ::=
+<tr><td align=right>      <td><var>simple-c-type</var>
+<tr><td align=right>    | <td><code>c-pointer</code>
+<tr><td align=right>    | <td><code>c-string</code>
+<tr><td align=right>    | <td><code>(c-struct <var>class</var>
+                                 (<var>ident</var> <var>c-type</var>)*)</code>
+<tr><td align=right>    | <td><code>(c-union (<var>ident</var>
+                                     <var>c-type</var>)*)</code>
+<tr><td align=right valign=top> | <td><code>(c-array <var>c-type</var>
+                                      <var>dimensions</var>)</code>
+<br>        <var>dimensions</var> ::= <var>number</var> |
+                                      <code>({<var>number</var>}*)</code>
+<tr><td align=right valign=top>    | <td><code>(c-array-max <var>c-type</var>
+                                               <var>maxdimension</var>)</code>
+<br>        <var>maxdimension</var> ::= <var>number</var>
+<tr><td align=right valign=top>    | <td><code>(c-function
+                                         {<var>option</var>}*)</code>
+<br>        <var>option</var> ::=
+<br>          &nbsp; <code>(:arguments {(<var>arg-name</var>
+                            <var>c-type</var> [<var>param-mode</var>
+                            [<var>allocation</var>]])}*)</code>
+<br>          | <code>(:return-type <var>c-type</var>
+                       [<var>allocation</var>])</code>
+<br>          | <code>(:language <var>language</var>)</code>
+<tr><td align=right>    | <td><code>(c-ptr <var>c-type</var>)</code>
+<tr><td align=right>    | <td><code>(c-ptr-null <var>c-type</var>)</code>
+<tr><td align=right>    | <td><code>(c-array-ptr <var>c-type</var>)</code>
+</table>
+
+<p><code>(<strong>def-c-type</strong> <var>name</var>
+<var>c-type</var>)</code> makes <var>name</var> a shortcut for
+<var>c-type</var>. Note that <var>c-type</var> may already refer to
+name. Forward declarations of types are not possible, however.
+
+<p>The type <code>c-pointer</code> corresponds to what C calls
+&#34;<code>void*</code>&#34;, an opaque pointer.
+
+<p>The type <code>c-string</code> corresponds to what C calls
+&#34;<code>char*</code>&#34;, a zero-terminated string. Its Lisp
+equivalent is a string, without the trailing zero character.
+
+<p>The type <code>(c-struct <var>class</var>
+(<var>ident<sub>1</sub></var> <var>type<sub>1</sub></var>)
+... (<var>ident<sub>n</sub></var> <var>type<sub>n</sub></var>))</code>
+is equivalent to what C calls &#34;<code>struct {
+<var>type<sub>1</sub></var> <var>ident<sub>1</sub></var>; ...;
+<var>type<sub>n</sub></var> <var>ident<sub>n</sub></var>;
+}</code>&#34;. Its Lisp equivalent is: if <var>class</var> is
+<code>vector</code>, a simple-vector; if <var>class</var> is
+<code>list</code>, a list; if <var>class</var> is a symbol naming a
+structure or CLOS class: an instance of this class, with slots of names
+<var>ident<sub>1</sub></var>,...,<var>ident<sub>n</sub></var>.
+
+<p>The type <code>(c-union (<var>ident<sub>1</sub></var>
+<var>type<sub>1</sub></var>) ... (<var>ident<sub>n</sub></var>
+<var>type<sub>n</sub></var>))</code> is equivalent to what C calls
+&#34;<code>union { <var>type<sub>1</sub></var>
+<var>ident<sub>1</sub></var>; ...; <var>type<sub>n</sub></var>
+<var>ident<sub>n</sub></var>; }</code>&#34;. Conversion to and from
+Lisp assumes that a value is to be viewed as being of
+<var>type<sub>1</sub></var>.
+
+<p>The type <code>(c-array <var>type</var> <var>dim<sub>1</sub></var>
+... <var>dim<sub>n</sub></var>)</code> is equivalent to what C calls
+&#34;<code><var>type</var>
+[<var>dim<sub>1</sub></var>]...[<var>dim<sub>n</sub></var>]</code>&#34;.
+Note that when an array is passed as an argument to a function in C, it
+is actually passed as a pointer; you therefore have to write
+<code>(c-ptr (c-array ...))</code> for this argument's type.
+
+<p>The type <code>(c-array-max <var>type</var> <var>maxdim</var>)</code>
+is equivalent to what C calls &#34;<code><var>type</var>
+[<var>maxdim</var>]</code>&#34;, an array containing up to
+<var>maxdim</var> elements. The array is zero-terminated if it contains
+less than <var>maxdim</var> elements. Conversion from Lisp of an array
+with more than <var>maxdim</var> elements silently ignores the
+superfluous elements.
+
+<p>The type <code>(c-ptr <var>type</var>)</code> is equivalent to what C
+calls &#34;<code><var>type</var> *</code>&#34;: a pointer to a single
+item of the given <var>type</var>.
+
+<p>The type <code>(c-ptr-null <var>type</var>)</code> is also equivalent
+to what C calls &#34;<code><var>type</var> *&#34;</code>: a pointer to a
+single item of the given <var>type</var>, with the exception that C
+<code>NULL</code> corresponds to Lisp <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+
+<p>The type <code>(c-array-ptr <var>type</var>)</code> is equivalent to
+what C calls &#34;<code><var>type</var> (*)[]</code>&#34;: a pointer
+to a zero-terminated array of items of the given <var>type</var>.
+
+<p>The type <code>(c-function (:return-type <var>rtype</var>)
+(:arguments (<var>arg<sub>1</sub></var> <var>type<sub>1</sub></var> ...)
+...))</code> designates a C function that can be called according to the
+given prototype <code>(<var>rtype</var> (*)
+(<var>type<sub>1</sub></var>, ...))</code>.  The <var>language</var> is
+either <code>:C</code> (denotes K&amp;R C) or <code>:STDC</code>
+(denotes ANSI C) or <code>:STDC-STDCALL</code> (denotes ANSI C with
+<em>stdcall</em> calling convention). It specifies whether the C
+function has been compiled by a K&amp;R C compiler or by an ANSI C
+compiler, and possibly the calling convention.  Conversion between C
+functions and Lisp functions is transparent.
+
+<p><code>(<strong>def-c-struct</strong> <var>name</var>
+(<var>ident</var> <var>c-type</var>)*)</code> defines <var>name</var> to
+be both a <code>defstruct</code> structure type and a foreign C type
+with the given slots.
+
+<p><code>(<strong>def-c-enum</strong> <var>name</var> {<var>ident</var>
+| (<var>ident</var> [<var>value</var>])}*)</code> defines
+<var>ident</var>s as constants, similarly to the C declaration
+<code>enum { <var>ident</var> [= <var>value</var>], ... };</code>
+
+<p><code>(<strong>c-lines</strong> <var>format-string</var>
+{<var>argument</var>}*)</code> outputs the string <code>(format nil
+<var>format-string</var> {<var>argument</var>}*)</code> to the C output
+file. This is a rarely needed low-level facility.
+
+<p>The form <code>(<strong>sizeof</strong> <var>c-type</var>)</code>
+returns the size and alignment of a C type, measured in bytes.
+
+<p>The form <code>(<strong>bitsizeof</strong> <var>c-type</var>)</code>
+returns the size and alignment of a C type, measured in bits.
+
+<p>The predicate <code>(<strong>validp</strong>
+<var>foreign-entity</var>)</code> returns <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> if the
+<var>foreign-entity</var> (e.g. the Lisp equivalent of a
+<code>c-pointer</code>) refers to a pointer which is invalid because it
+comes from a previous Lisp session. It returns <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"><code>t</code></a> if
+<var>foreign-entity</var> can be used within the current Lisp process.
+
+<h4>Foreign variables</h4>
+
+<p>Foreign variables are variables whose storage is allocated in the
+foreign language module. They can nevertheless be evaluated and modified
+through <a href="http://www.harlequin.com/education/books/HyperSpec/Body/spefor_setq.html">
+<code>setq</code></a>, just as normal variables can, except that the
+range of allowed values is limited according to the variable's foreign
+type. Note that for a foreign variable <var>x</var> the form
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_eql.html"> eql</a>
+<var>x</var> <var>x</var>)</code> is not necessarily true, since every
+time <var>x</var> is evaluated its foreign value is converted to a
+freshly created Lisp value.
+
+<p><code>(<strong>def-c-var</strong> <var>name</var>
+{<var>option</var>}*)</code>
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td><code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td><code>(:type <var>c-type</var>)</code>
+<tr><td align=right>    | <td><code>(:read-only <var>boolean</var>)</code>
+<tr><td align=right>    | <td><code>(:alloc <var>allocation</var>)</code>
+</table>
+defines a foreign variable. <var>name</var> is the Lisp name, a regular
+Lisp symbol.
+
+<p>The <code>:name</code> option specifies the name, as seen from C, as
+a string. If not specified, it is derived from the print name of the
+Lisp name.
+
+<p>The <code>:type</code> option specifies the variable's foreign type.
+
+<p>If the <code>:read-only</code> option is specified and non-<a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>, it will be
+impossible to change the variable's value from within Lisp (using
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/spefor_setq.html">
+<code>setq</code></a> or similar).
+
+<p>The <code>:alloc</code> option can be either <code>:none</code> or
+<code>:malloc-free</code> and defaults to <code>:none</code>.  If it is
+<code>:malloc-free</code>, any values of type <code>c-string</code>,
+<code>(c-ptr ...)</code>, <code>(c-ptr-null ...)</code>,
+<code>(c-array-ptr ...)</code> within the foreign value are assumed to
+be pointers to <code>malloc()</code>-allocated storage, and when
+<code>setq</code> replaces an old value by a new one, the old storage is
+freed using <code>free()</code> and the new storage allocated using
+<code>malloc()</code>. If it is <code>:none</code>, <code>setq</code>
+assumes that the pointers point to good storage (not <code>NULL</code>!)
+and overwrites the old values by the new ones. This is dangerous (just
+think of overwriting a string with a longer one or storing some data in
+a <code>NULL</code> pointer...) and deprecated.
+
+<h4>Operations on foreign places</h4>
+
+<p>A foreign variable <var>name</var> defined by <code>def-c-var</code>
+defines a "place", i.e.,  a form which can also be used as
+argument to <a href="http://www.harlequin.com/education/books/HyperSpec/Body/mac_setfcm_psetf.html">
+<code>setf</code></a>. (An "lvalue" in C terminology.)
+The following operations are available on foreign places:
+
+<p><code>(<strong>element</strong> <var>place</var>
+<var>index<sub>1</sub></var> ... <var>index<sub>n</sub></var>)</code>
+<br>Array element: If <var>place</var> is of foreign type <code>(c-array
+<var>c-type</var> <var>dim<sub>1</sub></var>
+... <var>dim<sub>n</sub></var>)</code> and 0 &lt;=
+<var>index<sub>1</sub></var> &lt; <var>dim<sub>1</sub></var>, ..., 0
+&lt;= <var>index<sub>n</sub></var> &lt; <var>dim<sub>n</sub></var>, this
+will be the place corresponding to <code>(aref <var>place</var>
+<var>index<sub>1</sub></var> ... <var>index<sub>n</sub></var>)</code> or
+<code><var>place</var>[<var>index<sub>1</sub></var>]...[<var>index<sub>n</sub></var>]</code>.
+It is a place of type <var>c-type</var>.  If <var>place</var> is of
+foreign type <code>(c-array-max <var>c-type</var> <var>dim</var>)</code>
+and 0 &lt;= <var>index</var> &lt; <var>dim</var>, this will be the place
+corresponding to <code>(aref <var>place</var> <var>index</var>)</code>
+or <code><var>place</var>[<var>index</var>]</code>.  It is a place of
+type <var>c-type</var>.
+
+<p><code>(<strong>deref</strong> <var>place</var>)</code>
+<br>Dereference pointer: If <var>place</var> is of foreign type
+<code>(c-ptr <var>c-type</var>)</code> or <code>(c-ptr-null
+<var>c-type</var>)</code>, this will be the place the pointer points
+to. It is a place of type <var>c-type</var>. For <code>(c-ptr-null
+<var>c-type</var>)</code>, the <var>place</var> may not be
+<code>NULL</code>.
+
+<p><code>(<strong>slot</strong> <var>place</var>
+<var>slot-name</var>)</code>
+ <br>Struct or union component: If <var>place</var> is of foreign type
+ <code>(c-struct <var>class</var> ... (<var>slot-name</var>
+ <var>c-type</var>) ...)</code> or of type <code>(c-union
+ ... (<var>slot-name</var> <var>c-type</var>) ...)</code>, this will be
+ of type <var>c-type</var>.
+
+<p><code>(<strong>cast</strong> <var>place</var> <var>c-type</var>)</code>
+ <br>Type change: A place denoting the same memory locations as the
+ original <var>place</var>, but of type <var>c-type</var>.
+
+<p><code>(<strong>typeof</strong> <var>place</var>)</code>
+ <br>returns the <var>c-type</var> corresponding to the <var>place</var>.
+
+<p><code>(<strong>sizeof</strong> <var>place</var>)</code>
+ <br>returns the size and alignment of the C type of <var>place</var>,
+measured in bytes.
+
+<p><code>(<strong>bitsizeof</strong> <var>place</var>)</code>
+ <br>returns the size and alignment of the C type of <var>place</var>,
+measured in bits.
+
+<h4>Foreign functions</h4>
+
+<p>Foreign functions are functions which are defined in the foreign
+language.  There are <em>named foreign functions</em> (imported via
+<code>def-call-out</code> or created via <code>def-call-in</code>) and
+<em>anonymous foreign functions</em>; they arise through conversion of
+function pointers.
+
+<p>A <em>"call-out"</em> function is a foreign function called
+from Lisp: control flow temporarily leaves Lisp.  A
+<em>"call-in"</em> function is a Lisp function called from the
+foreign language: control flow temporary enters Lisp.
+
+<p><code>(<strong>def-call-out</strong> <var>name</var>
+{<var>option</var>}*)</code>
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td><code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td><code>(:arguments {(<var>arg-name</var>
+                                     <var>c-type</var> [<var>param-mode</var>
+                                     [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td><code>(:return-type <var>c-type</var>
+                                     [<var>allocation</var>])</code>
+<tr><td align=right>    | <td><code>(:language <var>language</var>)</code>
+</table>
+defines a named call-out function. Any Lisp function call to
+<code>#'<var>name</var></code> is redirected to call the C function
+<var>c-name</var>. The <var>language</var> is either <code>:C</code>
+(denotes K&amp;R C) or <code>:STDC</code> (denotes ANSI C) or
+<code>:STDC-STDCALL</code> (denotes ANSI C with <em>stdcall</em>
+calling convention). It specifies whether the C function has been
+compiled by a K&amp;R C compiler or by an ANSI C compiler, and possibly
+the calling convention.
+
+<p><code><strong>def-c-call-out</strong></code> is equivalent to
+<code>def-call-out</code> with <code>:language :stdc</code>.
+
+<p><code>(<strong>def-call-in</strong> <var>name</var>
+{<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td><code>(:name <var>c-name</var>)</code>
+<tr><td align=right>    | <td><code>(:arguments {(<var>arg-name</var>
+                                     <var>c-type</var> [<var>param-mode</var>
+                                     [<var>allocation</var>]])}*)</code>
+<tr><td align=right>    | <td><code>(:return-type <var>c-type</var>
+                                     [<var>allocation</var>])</code>
+<tr><td align=right>    | <td><code>(:language <var>language</var>)</code>
+</table>
+defines a named call-in function. Any C function call to the C function
+<var>c-name</var> is redirected to call the Lisp function
+<code>#'<var>name</var></code>. The <var>language</var> is either
+<code>:C</code> (denotes K&amp;R C) or <code>:STDC</code> (denotes ANSI C)
+or <code>:STDC-STDCALL</code> (denotes ANSI C with <em>stdcall</em>
+calling convention). It specifies whether the calling code has been
+compiled by a K&amp;R C compiler or by an ANSI C compiler, and possibly
+the calling convention.
+
+<p><code><strong>def-c-call-in</strong></code> is equivalent to
+<code>def-call-in</code> with <code>:language :stdc</code>.
+
+<h4>Argument and result passing conventions</h4>
+
+<p>When passed to and from functions, allocation of arguments and
+results is handled as follows:
+
+<p>Values of <var>simple-c-type</var>, <code>c-pointer</code> are passed
+on the stack, with dynamic extent. The <var>allocation</var> is
+effectively ignored.
+
+<p>Values of type <code>c-string</code>, <code>(c-ptr</code>
+...<code>)</code>, <code>(c-ptr-null</code> ...<code>)</code>,
+<code>(c-array-ptr</code> ...<code>)</code> need storage. The
+<var>allocation</var> specifies the allocation policy:
+
+<table border=1>
+ <tr><th><var>allocation</var> <th> meaning
+ <tr><th align=left><code>:none</code> <td>no storage is allocated.
+ <tr><th align=left><code>:alloca</code>
+     <td>allocation of storage on the stack, which has dynamic extent.
+ <tr><th align=left><code>:malloc-free</code>
+     <td>storage will be allocated via <code>malloc()</code>
+         and freed via <code>free()</code>.
+</table>
+
+<p>If no <var>allocation</var> is specified, the default
+<var>allocation</var> is <code>:none</code> for most types, but
+<code>:alloca</code> for <code>c-string</code> and <code>(c-ptr</code>
+...<code>)</code> and <code>(c-ptr-null</code> ...<code>)</code> and
+<code>(c-array-ptr</code> ...<code>)</code> and for <code>:out</code>
+arguments. [Subject to change!]  The <code>:malloc-free</code> policy
+provides the ability to pass arbitrarily nested structs containing
+pointers pointing to structs ... within a single conversion.
+
+<dl>
+<dt>For call-out functions:<dd>
+  <dl>
+  <dt>For arguments passed from Lisp to C:<dd>
+    <dl>
+    <dt>If <var>allocation</var> is <code>:malloc-free</code>,
+       <dd>Lisp allocates the storage using malloc() and never deallocates it.
+       The C function is supposed to call free() when done with it.
+    <dt>If <var>allocation</var> is <code>:alloca</code>,
+       <dd>Lisp allocates the storage on the stack, with dynamic extent. It is
+       freed when the C function returns.
+    <dt>If <var>allocation</var> is <code>:none</code>,
+       <dd>Lisp assumes that the pointer already points to a valid area of the
+       proper size and puts the result value there. This is dangerous! and
+       deprecated.
+    </dl>
+  <dt>For results passed from C to Lisp:<dd>
+    <dl>
+    <dt>If <var>allocation</var> is <code>:malloc-free</code>,
+       <dd>Lisp calls free() on it when done.
+    <dt>If <var>allocation</var> is <code>:none</code>,
+       <dd>Lisp does nothing.
+    </dl>
+  </dl>
+<dt>For call-in functions:<dd>
+  <dl>
+  <dt>For arguments passed from C to Lisp:<dd>
+    <dl>
+    <dt>If <var>allocation</var> is <code>:malloc-free</code>,
+       <dd>Lisp calls free() on it when done.
+    <dt>If <var>allocation</var> is <code>:alloca</code> or
+       <code>:none</code>, <dd>Lisp does nothing.
+    </dl>
+  <dt>For results passed from Lisp to C:<dd>
+    <dl>
+    <dt>If <var>allocation</var> is <code>:malloc-free</code>,
+       <dd>Lisp allocates the storage using malloc() and never
+       deallocates it. The C function is supposed to call free() when
+       done with it.
+    <dt>If <var>allocation</var> is <code>:none</code>,
+       <dd>Lisp assumes that the pointer already points to a valid area
+       of the proper size and puts the result value there. This is
+       dangerous! and deprecated.
+    </dl>
+  </dl>
+</dl>
+
+<p>A function parameter's <var>param-mode</var> may be
+
+<dl>
+<dt>either <code>:in</code> (means: read-only):
+<dd>       The caller passes information to the callee.
+<dt>or     <code>:out</code> (means: write-only):
+<dd>       The callee passes information back to the caller on return.
+       When viewed as a Lisp function, there is no Lisp argument corresponding
+       to this, instead it means an additional return value.
+<dt>or     <code>:in-out</code> (means: read-write):
+<dd>       Information is passed from the caller to the callee and then back to
+       the caller. When viewed as a Lisp function, the &#34;<code>:out</code>&#34; value is
+       returned as an additional multiple value.
+</dl>
+The default is <code>:in</code>.
+
+<p>[Currently, only <code>:in</code> is fully
+implemented. <code>:out</code> works only with
+<var>allocation</var> = <code>:alloca</code>.]
+
+<dl>
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.
+</em>
+<dd>
+<var>allocation</var> may not be <code>:malloc-free</code> because there
+is no commonly used <code>malloc()/free()</code> library function.
+
+<p>The <var>allocation</var> may be followed by a register
+specification, any of the symbols <code>:d0</code>, <code>:d1</code>,
+<code>:d2</code>, <code>:d3</code>, <code>:d4</code>, <code>:d5</code>,
+<code>:d6</code>, <code>:d7</code>, <code>:a0</code>, <code>:a1</code>,
+<code>:a2</code>, <code>:a3</code>, <code>:a4</code>, <code>:a5</code>,
+<code>:a6</code>, each representing one 680x0 register. This works only
+for integral types: integers, pointers, <code>c-string</code>,
+<code>c-function</code>.
+</dl>
+
+<p>Passing <code>c-struct</code>, <code>c-union</code>,
+<code>c-array</code>, <code>c-array-max</code> values as arguments (not
+via pointers) is only possible to the extent the C compiler supports
+it. Most C compilers do it right, but some C compilers (such as gcc on
+hppa) have problems with this.
+
+<!-- #ifdef UNICODE -->
+<dl>
+<dt><em>Platform dependent: Only in CLISP built <strong>with</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+A symbol-macro place <code><strong>lisp:*foreign-encoding*</strong></code>
+contains the encoding for characters and strings passed through the
+FFI. Its value must be a 1:1 encoding, i.e., an encoding in which every
+character is represented by one byte.
+</dl>
+<!-- #endif -->
+
+<h4>Examples</h4>
+
+Ex. 1: The C declaration
+<pre>
+<code>       struct foo {
+           int a;
+           struct foo * b[100];
+       };
+</code></pre>
+corresponds to
+<pre>
+<code>       (def-c-struct foo
+         (a int)
+         (b (c-array (c-ptr foo) 100))
+       )
+</code></pre>
+The element access
+<pre>
+<code>       struct foo f;
+       f.b[7].a
+</code></pre>
+corresponds to
+<pre>
+<code>       (declare (type foo f))
+       (foo-a (aref (foo-b f) 7)) or (slot-value (aref (slot-value f 'b) 7) 'a)
+</code></pre>
+Ex. 2: Here is an example of an external C variable and some accesses:
+<pre>
+<code>       struct bar {
+           short x, y;
+           char a, b;
+           int z;
+           struct bar * n;
+       };
+
+       extern struct bar * my_struct;
+
+       my_struct-&gt;x++;
+       my_struct-&gt;a = 5;
+       my_struct = my_struct-&gt;n;
+</code></pre>
+corresponds to
+<pre>
+<code>       (def-c-struct bar
+         (x short)
+         (y short)
+         (a char)
+         (b char) ; or (b character) if it represents a character, not a number
+         (z int)
+         (n (c-ptr bar))
+       )
+
+       (def-c-var my_struct (:type (c-ptr bar)))
+
+       (setq my_struct (let ((s my_struct)) (incf (slot-value s 'x)) s))
+       or (incf (slot my_struct 'x))
+       (setq my_struct (let ((s my_struct)) (setf (slot-value s 'a) 5) s))
+       or (setf (slot my_struct 'a) 5)
+       (setq my_struct (slot-value my_struct 'n))
+       or (setq my_struct (deref (slot my_struct 'n)))
+</code></pre>
+Ex. 3: An example for calling an external function:
+On ANSI C systems, &lt;stdlib.h&gt; contains the declarations
+<pre>
+<code>       typedef struct {
+         int quot;   /* Quotient */
+         int rem;    /* Remainder */
+       } div_t;
+       extern div_t div (int numer, int denom);
+</code></pre>
+This translates to
+<pre>
+<code>       (def-c-struct div_t
+         (quot int)
+         (rem int)
+       )
+       (def-c-call-out div (:arguments (numer int) (denom int))
+                           (:return-type div_t)
+       )
+</code></pre>
+Sample call from within Lisp:
+<pre>
+<code>       &gt; (div 20 3)
+       #S(DIV :QUOT 6 :REM 2)
+</code></pre>
+Ex. 4: Another example for calling an external function:
+<p>
+Suppose the following is defined in a file <code>"cfun.c"</code>:
+<pre>
+<code>       struct cfunr { int x; char *s; };
+       struct cfunr * cfun (i,s,r,a)
+           int i;
+           char *s;
+           struct cfunr * r;
+           int a[10];
+       {
+           int j;
+           struct cfunr * r2;
+           printf("i = %d\n", i);
+           printf("s = %s\n", s);
+           printf(&#34;r-&gt;x = %d\n&#34;, r-&gt;x);
+           printf(&#34;r-&gt;s = %s\n&#34;, r-&gt;s);
+           for (j = 0; j &lt; 10; j++) printf("a[%d] = %d.\n", j, a[j]);
+           r2 = (struct cfunr *) malloc (sizeof (struct cfunr));
+           r2-&gt;x = i+5;
+           r2-&gt;s = "A C string";
+           return r2;
+       }
+</code></pre>
+It is possible to call this function from Lisp using the file
+<code>"callcfun.lsp"</code> (do not call it <code>"cfun.lsp"</code> -
+<code>compile-file</code> would overwrite <code>"cfun.c"</code>) whose
+contents is:
+<pre>
+<code>       (in-package "TEST-C-CALL" :use '("LISP" "FFI"))
+       (def-c-struct cfunr (x int) (s c-string))
+       (def-c-call-out cfun (:arguments (i int)
+                                        (s c-string)
+                                        (r (c-ptr cfunr) :in :alloca)
+                                        (a (c-ptr (c-array int 10)) :in :alloca)
+                            )
+                            (:return-type (c-ptr cfunr))
+       )
+       (defun call-cfun ()
+         (cfun 5 "A Lisp string" (make-cfunr :x 10 :s "Another Lisp string")
+               '#(0 1 2 3 4 5 6 7 8 9)
+       ) )
+</code></pre>
+Use the module facility:
+<pre>
+<code>       $ clisp-link create-module-set cfun callcfun.c
+       $ cc -O -c cfun.c
+       $ cd cfun
+       $ ln -s ../cfun.o cfun.o
+       Add cfun.o to NEW_LIBS and NEW_FILES in link.sh.
+       $ cd ..
+       $ base/lisp.run -M base/lispinit.mem -c callcfun.lsp
+       $ clisp-link add-module-set cfun base base+cfun
+       $ base+cfun/lisp.run -M base+cfun/lispinit.mem -i callcfun
+       &gt; (test-c-call::call-cfun)
+       i = 5
+       s = A Lisp string
+       r-&gt;x = 10
+       r-&gt;s = Another Lisp string
+       a[0] = 0.
+       a[1] = 1.
+       a[2] = 2.
+       a[3] = 3.
+       a[4] = 4.
+       a[5] = 5.
+       a[6] = 6.
+       a[7] = 7.
+       a[8] = 8.
+       a[9] = 9.
+       #S(TEST-C-CALL::CFUNR :X 10 :S "A C string")
+       &gt;
+       $ rm -r base+cfun
+</code></pre>
+
+<p>Note that there is a memory leak here: The return value
+<code>r2</code> of <code>cfun()</code> is <code>malloc()</code>ed but
+never <code>free()</code>d. Specifying
+<pre>
+<code>       (:return-type (c-ptr cfunr) :malloc-free)
+</code></pre>
+
+<p>is not an alternative because this would also
+<code>free(r2-&gt;x)</code> but <code>r2-&gt;x</code> is a pointer to
+static data.
+
+<p>Ex. 5: To sort an array of double-floats using the Lisp function
+<code>sort</code> instead of the C library function
+<code>qsort()</code>, one can use the following interface code
+<code>"sort1.c"</code>. The main problem is to pass a
+variable-sized array.
+
+<pre>
+<code>       extern void lispsort_begin (int);
+       void* lispsort_function;
+       void lispsort_double (int n, double * array)
+       {
+           double * sorted_array;
+           int i;
+           lispsort_begin(n); /* store #'sort2 in lispsort_function */
+           sorted_array = ((double * (*) (double *)) lispsort_function) (array);
+           for (i = 0; i &lt; n; i++) array[i] = sorted_array[i];
+           free(sorted_array);
+       }
+</code></pre>
+This is accompanied by <code>"sort2.lsp"</code>:
+<pre>
+<code>       (use-package "FFI")
+       (def-call-in lispsort_begin (:arguments (n int))
+                                   (:return-type nil)
+                                   (:language :stdc)
+       )
+       (def-c-var lispsort_function (:type c-pointer))
+       (defun lispsort_begin (n)
+         (setf (cast lispsort_function
+                     `(c-function
+                        (:arguments (v (c-ptr (c-array double-float ,n))))
+                        (:return-type (c-ptr (c-array double-float ,n))
+                                      :malloc-free
+                      ) )
+               )
+               #'sort2
+       ) )
+       (defun sort2 (v)
+         (declare (type vector v))
+         (sort v #'&lt;)
+       )
+</code></pre>
+To test this, use the following test file <code>"sorttest.lsp"</code>:
+<pre>
+<code>       (def-call-out sort10
+                     (:name "lispsort_double")
+                     (:language :stdc)
+                     (:arguments (n int)
+                                 (array (c-ptr (c-array double-float 10))
+                                        :in-out
+       )             )           )
+</code></pre>
+Now try
+<pre>
+<code>       $ clisp-link create-module-set sort sort2.c sorttest.c
+       $ cc -O -c sort1.c
+       $ cd sort
+       $ ln -s ../sort1.o sort1.o
+       Add sort1.o to NEW_LIBS and NEW_FILES in link.sh.
+       $ cd ..
+       $ base/lisp.run -M base/lispinit.mem -c sort2.lsp sorttest.lsp
+       $ clisp-link add-module-set sort base base+sort
+       $ base+sort/lisp.run -M base+sort/lispinit.mem -i sort2 sorttest
+       &gt; (sort10 10 '#(0.501d0 0.528d0 0.615d0 0.550d0 0.711d0
+                       0.523d0 0.585d0 0.670d0 0.271d0 0.063d0))
+       #(0.063d0 0.271d0 0.501d0 0.523d0 0.528d0 0.55d0 0.585d0 0.615d0 0.67d0 0.711d0)
+       $ rm -r base+sort
+</code></pre>
+<!-- #endif -->
+
+<!-- #ifdef HAVE_AFFI -->
+<a name="affi"></a>
+<h3>Extensions-2.4. The Amiga Foreign Function Call Facility</h3>
+
+<em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+
+<h4>Another Foreign Function Interface</h4>
+
+<p>All symbols relating to the simple foreign function interface are
+exported from the package <code>AFFI</code>. To use them,
+<code>(use-package "AFFI")</code>.
+
+<h4>Design issues</h4>
+
+<p>AFFI was designed to be small in size but powerful enough to use most
+library functions. Lisp files may be compiled to <code>.fas</code> files
+without the need to load function definition files at run-time and
+without external C or linker support. Memory images can be created,
+provided that the function libraries are opened at run-time.
+
+<p>Therefore, AFFI supports only primitive C types (integers 8, 16 and
+32 bits wide, signed or unsigned, pointers) and defines no new types or
+classes.  Foreign functions are not first-class objects (you can define
+a lambda yourself), name spaces are separate.
+
+<p>The AFFI does no tracking of resources. Use <code>finalize</code>.
+
+<h4>Overview</h4>
+
+<p>These are the AFFI forms:
+
+<p><code>(declare-library-base <var>keyword-base</var>
+<var>library-name</var>)</code>
+
+<p><code>(require-library-functions <var>library-name</var> [(:import
+{<var>string-name</var>}*)])</code>
+
+<p><code>(open-library <var>base-symbol</var>)</code>
+
+<p><code>(clos-library <var>base-symbol</var>)</code>
+
+<p><code>(with-open-library (<var>base-symbol</var> |
+<var>library-name</var>) {<var>form</var>}*)</code>
+
+<p><code>(defflibfun <var>function-name</var> <var>base-symbol</var>
+<var>offset</var> <var>mask</var> <var>result-type</var>
+{<var>argument-type</var>}*)</code>
+
+<p><code>(declare-library-function <var>function-name</var>
+<var>library-name</var> {<var>option</var>}*)</code>
+
+<p><code>(flibcall <var>function-name</var>
+{<var>argument</var>}*)</code>
+
+<p><code>(mlibcall <var>function-name</var>
+{<var>argument</var>}*)</code>
+
+<p><code>(mem-read <var>address</var> <var>result-type</var>
+[<var>offset</var>])</code>
+
+<p><code>(mem-write <var>address</var> <var>type</var> <var>value</var>
+[<var>offset</var>])</code>
+
+<p><code>(mem-write-vector <var>address</var> <var>vector</var>
+[<var>offset</var>])</code>
+
+<p><code>(nzero-pointer-p <var>value</var>)</code>
+
+<p>Except for <code>with-open-library</code>,
+<code>declare-library-function</code> and <code>mlibcall</code>, all of
+the above are functions.
+
+<p>A library contains a collection of functions. The library is referred
+to by a symbol referred as library-base at the AFFI level. This symbol
+is created in the package <code>AFFI</code>. The link between this
+symbol and the OS-level library name is established by
+<code>declare-library-base</code>. To avoid multiple package conflicts,
+this and only this function requires the symbol-name to be in the
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/sec_11-1-2-3.html">
+<code>KEYWORD</code></a> package. The function returns the library-base.
+
+<p>A library may be opened by <code>open-library</code> and closed by
+<code>close-library</code>. An opened library must be
+closed. <code>with-open-library</code> is provided to automatically
+close the library for you, thus it is much safer to use.
+
+<p>A function is contained in a library. Every function is referred to
+by a symbol. A function is defined through <code>defflibfun</code> or
+<code>declare-library-function</code> by giving the function name, the
+library-base, an offset into the library, a mask
+(or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>)
+for register-based library calls, the result type and all
+parameter-types.  <code>require-library-functions</code> loads the
+complete set of functions defined in a library file. Symbols are created
+in the package <code>AFFI</code> and imported into the current package.
+
+<p><code>flibcall</code> and <code>mlibcall</code> call library
+functions. <code>mlibcall</code> is a macro that does a few checks at
+macroexpansion time and allows the compiler to inline the call, not
+requiring the foreign function to be defined again at load or execution
+time. The use of this macro is advertised wherever possible.
+
+<p><code>mem-read</code> reads an arbitrary address (with offset for
+structure references) and returns the given type.
+
+<p><code>mem-write</code> writes an arbitrary
+address. <code>mem-write-vector</code> copies the content of a Lisp
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">
+<code>unsigned-byte</code></a> <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html">
+<code>vector</code></a> into memory.
+
+<p><code>nzero-pointer-p</code> tests for non-<code>NULL</code> pointers
+in all recognized representations (<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_null.html">
+<code>null</code></a>, <a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">
+<code>unsigned-byte</code></a> and <code>foreign-pointer</code>).
+
+
+<h4>Foreign Libraries</h4>
+
+<p><code>declare-library-base</code> ought to be wrapped in an
+<code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_eval-when.html">eval-when</a>
+(compile eval load) ...)</code> form and come before any function is
+referenced, because the library base symbol must be known.
+
+<p><code>open-library</code> tries to open the library referenced by the
+base symbol.  Therefore it must have been preceded with
+<code>declare-library-base</code>. The call returns
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> on
+failure. <code>open-library</code> calls nest. Every successful call
+must be matched by <code>close-library</code>.
+<code>with-open-library</code> does this for you and also allows you to
+specify the library by name, provided that its base has been
+declared. It is recommended to use this macro and to reference the
+library by name.
+
+<p>CLISP will not close libraries for you at program exit. [A previous
+version did so but now AFFI is a module and there are no module exit
+functions.]  Programmers, watch <code>affi::*libraries-alist*</code>.
+
+
+<h4>(Foreign) C types</h4>
+
+<p>The following foreign C types are used in AFFI. They are <em>not</em>
+regular Common Lisp types or CLOS classes.
+
+<table border=1>
+ <tr><th>AFFI name <th>Lisp equiv <th>C equiv <th>Comment
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+     <td><code>void</code>
+     <td>as a result type for functions only
+ <tr><td><code>4</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                32)</code>
+     <td><code>unsigned long</code>
+ <tr><td><code>2</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                16)</code>
+     <td><code>unsigned short</code>
+ <tr><td><code>1</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_unsigned-byte.html">unsigned-byte</a>
+                8)</code>
+     <td><code>unsigned char</code>
+ <tr><td><code>-4</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                32)</code>
+     <td><code>long</code>
+ <tr><td><code>-2</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                16)</code>
+     <td><code>short</code>
+ <tr><td><code>-1</code>
+     <td><code>(<a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_signed-byte.html">signed-byte</a>
+                8)</code>
+     <td><code>signed char</code>
+ <tr><td><code>0</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/typ_boolean.html"><code>boolean</code></a>
+     <td><code>BOOL</code>
+     <td>as a result type for functions only
+ <tr><td><code>*</code>
+     <td>opaque
+     <td><code>void*</code>
+ <tr><td><code>:external</code>
+     <td>opaque
+     <td><code>void*</code>
+ <tr><td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html"><code>string</code></a>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html"><code>string</code></a> or
+         <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html"><code>vector</code></a>
+     <td><code>char*</code>
+ <tr><td><code>:io</code>
+     <td><a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html"><code>string</code></a> or
+         <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_vector.html"><code>vector</code></a>
+     <td><code>char*</code>
+</table>
+
+<p>Objects of type <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> are copied and passed
+NUL-terminated on the execution stack.  On return, a Lisp string is
+allocated and filled from the address returned (unless NULL). Functions
+with <code>:io</code> parameters are passed the address of the Lisp
+string or unsigned byte vector. These are not NUL-terminated!  This is
+useful for functions like like <code>read()</code> which do not need an
+array at a constant address longer than the dynamic extent of the call
+(it is dangerous to define callback functions with <code>:io</code> (or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a>) type parameters). Arguments of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_integer.html">
+<code>integer</code></a> and <code>foreign-pointer</code> are always
+acceptable where a <a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> or <code>:io</code> type is specified.
+
+<!-- #ifdef UNICODE -->
+<dl>
+<dt><em>Platform dependent: Only in CLISP built <strong>with</strong>
+    compile-time flag <code><strong>UNICODE</strong></code>.</em>
+<dd>
+A symbol-macro place <code><strong>lisp:*foreign-encoding*</strong></code>
+contains the encoding for characters and strings passed through the
+FFI. Its value must be a 1:1 encoding, i.e., an encoding in which every
+character is represented by one byte.
+</dl>
+<!-- #endif -->
+
+<p>To meet the design goals, predefined types and objects were used. As
+such, pointers were represented as integers. Now that there is the
+<code>foreign-pointer</code> type, both representations may be used on
+input. The pointer type should be therefore considered as opaque. Use
+<code>nzero-pointer-p</code> for NULL tests.
+
+
+<h4>Foreign functions</h4>
+
+<p>Foreign Functions are declared either through <code>defflibfun</code>
+or<code>declare-library-function</code>. The former is closer to the
+low-level implementation of the interface, the latter is closer to the
+other FFI.
+
+<p><code>defflibfun</code> requires the library base symbol and register
+mask to be specified, <code>declare-library-function</code> requires the
+library name and computes the mask from the declaration of the
+arguments.
+
+<p>The value of mask is implementation-dependent. On the Amiga, it is an
+integer whose hexadecimal value is the reverse of the function argument
+register numbers, where d0 has number <code>1</code> and a6 number
+<code>#xF</code>. A <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> mask is reserved
+for stack-based calls (unimplemented).
+
+<p>The AFFI type <code>0</code> is only acceptable as a function result
+type and yields either <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a> or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a>. The
+difference between <code>*</code> and <code>:external</code> is the
+following: <code>*</code> uses integers, <code>:external</code> uses
+<code>foreign-pointer</code> as function result-type (except from
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> for a NULL pointer) and refuses objects of type
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/syscla_string.html">
+<code>string</code></a> or unsigned byte vector as input. Thus
+<code>:external</code> provides some security on the input and the
+ability to use <a href="#final"><code>lisp:finalize</code></a> for
+resource-tracking on the output side.
+
+<p><code>(declare-library-function <var>name</var>
+<var>library-name</var> {<var>option</var>}*)</code>
+
+<table>
+<tr><td>  <var>option</var> ::=
+<tr><td align=right>      <td><code>(:offset <var>library-offset</var>)</code>
+<tr><td align=right>    | <td><code>(:arguments {(<var>arg-name</var> <var>AFFI-type</var> <var>register</var>)}*)</code>
+<tr><td align=right>    | <td><code>(:return-type <var>AFFI-type</var>)</code>
+</table>
+<table>
+<tr>  <td><var>register</var> ::= <td> <code>:d0</code> | <code>:d1</code> | ... | <code>:d7</code> | <code>:a0</code> | ... | <code>:a6</code>
+</table>
+declares a named library function for further reference through
+<code>flibcall</code> and <code>mlibcall</code>.
+
+<p><code>mlibcall</code> should be the preferred way of calling foreign
+functions (when they are known at compile-time) as macroexpansion-time
+checks may be performed and the call can be sort of inlined.
+
+
+<h4>Memory access</h4>
+
+<p><code>(mem-read <var>address</var> <var>type</var>
+<var>offset</var>)</code> can read 8, 16 and 32 bit signed or
+unsigned integers (AFFI types <code>-4</code>, <code>-2</code>,
+<code>-1</code>, <code>1</code>, <code>2</code>, <code>4</code>), a
+pointer (<code>*</code>), a NUL-terminated string (<code>string</code>)
+or, if the type argument is of type <code>string</code> or unsigned byte
+vector, it can fill this vector. <code>:external</code> is not an
+acceptable type as no object can be created by using
+<code>mem-read</code>.
+
+<p><code>(mem-write <var>address</var> <var>type</var> <var>value</var>
+[<var>offset</var>])</code> writes integers (AFFI type <code>-4</code>,
+<code>-2</code>, <code>-1</code>, <code>1</code>, <code>2</code> and
+<code>4</code>) or pointer values (type <code>*</code>), but not vectors
+to the specified memory address.
+
+<p><code>(mem-write-vector <var>address</var> <var>vector</var>
+[<var>offset</var>])</code> can write memory from the given vector (of
+type <code>string</code> or unsigned byte vector).
+
+
+<h4>Function Definition Files</h4>
+
+<p><code>require-library-functions</code> will <code>require</code> a
+file of name derived from thelibrary name and with type
+<code>"affi"</code>. It may be used to import all names into
+the current package or only a given subset identified by string names,
+using the <code>:import</code> keyword (recommended use). Some definition
+files for standard Amiga libraries are provided. See example 1 below.
+
+<p>As <code>require-library-functions</code> loads a global file which
+you, the programmer, may have not defined, you may consider declaring
+every function yourself to be certain what the return and argument types
+are. See example 4 below.
+
+<p>The file <code>read-fd.lsp</code> defines the function
+<code>make-partial-fd-file</code> with which the provided
+<code>".affi"</code> files have been prepared from the
+original Amiga FD files (located in the directory
+<code>FD:</code>). They must still be edited as the function cannot know
+whether a function accepts a <code>*</code>, <code>:io</code>,
+<code>string</code> or <code>:external</code> argument and because files
+in <code>FD:</code> only contain a register specification, not the width
+of integer arguments (<code>-4</code>, <code>-2</code>, <code>-1</code>,
+<code>1</code>, <code>2</code>, or <code>4</code>).
+
+
+<h4>Hints</h4>
+
+<p>By using appropriate <a href="http://www.harlequin.com/education/books/HyperSpec/Body/speope_eval-when.html">
+<code>eval-when</code></a> forms for
+<code>declare-library-base</code> and
+<code>require-library-functions</code> and not using
+<code>flibcall</code>, it is possible to write code that only loads
+library function definition files at compile-time. See example 1 below.
+
+<p>Do not rely on <code>finalize</code> to free resources for you, as
+CLISP does not call finalizers when it exits, use
+<code>unwind-protect</code>.
+
+
+<h4>Caveats</h4>
+
+<p>You can consider the library bases being symbols in need of being
+imported from the package AFFI originating from a brain-damage, causing
+the usual symbol headaches when using foreign functions calls within
+macros. Luckily, even if the high-level interface (or its implementation
+in <code>affi1.lsp</code>) were to change, the low-level part
+(<code>affi.d</code>) should remain untouched as all it knows are
+integers and foreign-pointers, no symbols. The difficulty is just to get
+the library base value at run-time. Feel free to suggest enhancements to
+this facility!
+
+
+<h4>Examples</h4>
+
+<p>NB: These examples are somewhat specific to the Amiga.
+
+<p>1. Using a predefined library function file
+<pre>
+<code>(use-package "AFFI")
+
+;; SysBase is the conventional name for exec.library
+;; It is only enforced by the file loaded by REQUIRE-LIBRARY-FUNCTIONS
+(eval-when (compile eval load)
+  (declare-library-base :SysBase "exec.library")) ;keyword avoids name conflicts
+
+;; using only MLIBCALL allows not to load definitions at load-time
+(eval-when (compile eval)
+  (require-library-functions "exec.library"
+    :import '("FindTask")))
+
+(with-open-library ("exec.library")
+  (print (mlibcall FindTask 0)))
+</code></pre>
+This file can be used in interpreted and compiled mode. Compiled, it will
+have inlined the library function calls.
+<p>
+
+2. Using flibcall
+<pre>
+<code>(use-package "AFFI")
+
+(eval-when (compile eval load)
+  (declare-library-base :SysBase "exec.library")) ;keyword avoids name conflicts
+
+;; The load situation permits the use of flibcall
+(eval-when (eval compile load)
+  (require-library-functions "exec.library"))
+
+(unless (open-library 'SysBase) (error "No library for SysBase"))
+(flibcall (if t 'FindTask 'Debug) 0)
+(close-library 'SysBase)
+</code></pre>
+<p>
+
+3. Be fully dynamic, defining library bases ourselves
+<pre>
+<code>(use-package "AFFI")
+
+(eval-when (compile eval load)
+  (defvar mylib (declare-library-base :foobase "foo.library")))
+(eval-when (eval compile load)          ;eval allows mlibcall, load flibcall
+  (defflibfun 'foo1 mylib -30 '#xA '* 'string)
+  (defflibfun 'foo2 mylib -36 '#x21 0 * 4))
+
+(defun foo (name)
+  (when (open-library mylib)
+    (list (mlibcall foo1 name) (flibcall 'foo2 name 123213))
+    (close-library mylib)))
+</code></pre>
+<p>
+4. Some sample function definitions
+<pre>
+<code>(defflibfun 'FindTask 'SysBase -294 #xA '* 'string)
+(declare-library-function FindTask "exec.library"
+  (:offset -294)
+  (:return-type *)
+  (:arguments
+   (name   string   :A1)))
+(declare-library-function NameFromLock "dos.library"
+  (:offset -402)
+  (:return-type 0)
+  (:arguments
+   (lock   4   :D1)
+   (buffer :io :D2)
+   (len    4   :D3)))
+
+(eval-when (compile eval)
+  (defconstant GVF_LOCAL_ONLY (ash 1 9))
+  (defflibfun 'SetVar 'DosBase -900 #x5432 0 'string 'string -4 4))
+(defun setvar (name value)
+  (with-open-library (DosBase)
+    ;; length of -1 means find length of NUL-terminated-string
+    (mlibcall SetVar name value -1 GVF_LOCAL_ONLY)))
+</code></pre>
+<!-- #endif -->
+
+<!-- #ifdef AMIGAOS -->
+<a name="rexx"></a><h3>Extensions-2.5. ARexx</h3>
+
+<em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+
+<p>CLISP comes with a small yet extensible and powerful ARexx interface.
+
+<p><code>(rexx-do-command "return address()" :string t :result
+t)</code> <br>tells you the name of the CLISP ARexx port. The default
+extension for CLISP ARexx scripts is <code>"cl"</code>.
+
+<p><code>(REXX-DO-COMMAND <var>command</var> &amp;key :string :result
+:token :io :host)</code> <br> -&gt; <code>(RC &amp;optional
+<var>result</var>)</code>, or <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> on failure
+
+<p><code>(REXX-RUN-COMMAND <var>command</var> &amp;KEY :string
+:token)</code> <br> -&gt; <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html">
+<code>t</code></a>, or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> on failure
+
+<p><code>(REXX-SEND-COMMAND <var>command</var> &amp;KEY :string :result
+:token :io :host)</code> <br> -&gt; <var>arexx-msg-handle</var>, or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> on failure
+
+<p><code>(REXX-WAIT-SENT-COMMAND <var>arexx-msg-handle</var>)</code>
+<br> -&gt; <code>(RC &amp;optional <var>result</var>)</code>, or
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a> on failure
+
+<p><code>(REXX-LOOP)</code> <br> -&gt; no return, use the
+<code>exit-loop.cl</code> ARexx script to abort the loop
+
+<p><var>command</var> may be a string denoting a command with optional
+arguments or a vector of strings thus denoting an ARexx function
+call. The first element in the vector is the function name, the others
+are the up to 15 arguments.
+
+<p>Messages may be sent to an arbitrary ARexx host, special cases are
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+<code>nil</code></a> (meaning <code>"REXX"</code>, the default) and <a
+href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_t.html"> <code>t</code></a> (<code>"AREXX"</code>
+for asynchronous execution).
+
+<p>ARexx server mode: Like Ispell, Csh and SKsh, you can run it in
+server mode by calling <code>(rexx-loop)</code>. You can then only exit
+with the ARexx <code>exit-loop.cl</code> script.
+
+<p>Restrictions: Currently CLISP is not able to wait for input from
+several sources, e.g. both a console and ARexx, at the same time.
+<!-- #endif -->
+
+<!-- #ifdef SOCKET_STREAMS -->
+<a name="socket"></a><h3>Extensions-2.6. Socket Streams</h3>
+
+<em>Platform dependent: <strong>UNIX</strong>,
+    <strong>Win32</strong> platforms only.</em>
+
+<dl><dt>
+<code>(<strong>lisp:socket-server</strong>
+       &amp;optional [<var>port-or-socket</var>])</code>
+<dd>This function creates a socket, binds a port to the socket, and
+then listens for connect attempts.  The server exists to watch for
+client connect attempts.  The optional argument is either a port
+(positive fixnum) or a socket-stream (from whose peer the connections
+will be made).
+<dt>
+<code>(<strong>lisp:socket-server-close</strong>
+       <var>socket-server</var>)</code>
+<dd>Closes down the server socket.
+<dt>
+<code>(<strong>lisp:socket-server-port</strong>
+       <var>socket-server</var>)</code>
+<dd>Returns the port which was bound using <code>lisp:socket-server</code>.
+<dt>
+<code>(<strong>lisp:socket-wait</strong> <var>socket-server</var>
+       &amp;optional [<var>seconds</var> [<var>microseconds</var>]])</code>
+<dd>Given time argument(s), waits for (possibly zero) fixed duration for
+a connect on the socket-server.  Without an argument,
+<code>socket-wait</code> blocks indefinitely.
+<dt>
+<code>(<strong>lisp:socket-accept</strong> <var>socket-server</var> &amp;key
+       [<a href="#eltype">:element-type</a>]
+       [<a href="#extfmt">:external-format</a>]
+       [<a href="#buffered">:buffered</a>])</code>
+<dd>Creates the server-side two-way stream for the connection.
+<dt>
+<code>(<strong>lisp:socket-connect</strong> <var>port</var>
+       &amp;optional [<var>host</var>] &amp;key
+       [<a href="#eltype">:element-type</a>]
+       [<a href="#extfmt">:external-format</a>]
+       [<a href="#buffered">:buffered</a>])</code>
+<dd>Attempts to create a client-side two-way stream.  Blocks until
+the server accepts the connections.
+<dt>
+<code>(<strong>lisp:socket-stream-host</strong>
+       <var>socket-stream</var>)</code>
+<dt>
+<code>(<strong>lisp:socket-stream-port</strong>
+       <var>socket-stream</var>)</code>
+<dd>These two functions return information about the
+socket stream.  For a server, <code>lisp:socket-stream-host</code>
+returns <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+<dt>
+<code>(<strong>lisp:socket-service-port</strong>
+       &amp;optional &#34;<var>service-name</var>&#34;
+       (<var>protocol</var> "tcp"))</code>
+<dd>A convenience function for looking up a port given the service name.
+It returns the servent struct as multiple values (name, list of aliases,
+port, protocol) for the given <code>service-name</code> and
+<code>protocol</code>, or all services as the list of vectors of length
+4, if <code>service-name</code> is not given or is <code>:default</code>
+or <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>.
+<dt>
+<code>(<strong>lisp:socket-stream-peer</strong>
+       <var>socket-stream</var>)</code>
+<dd>Given a stream, this function returns the name of the host on the
+opposite side of the connection and its port number; the server-side can
+use this to see who connected.
+<dt>
+<code>(<strong>lisp:socket-stream-local</strong>
+       <var>socket-stream</var>)</code>
+<dd>The dual to <code>lisp:socket-stream-peer</code> - same information,
+    host name and port number, but for the local host.
+</dl>
+<!-- #endif -->
+
+<a name="syscalls"></a><h3>Extensions-2.7. System Calls</h3>
+
+<p>When CLISP is configured with an option
+<code>--with-export-syscalls</code>, some system calls are available from
+lisp, in package <code>POSIX</code>.
+
+<dl>
+ <dt><code>(<strong>posix:resolve-host-ipaddr </strong>
+            &amp;optional <var>host</var>)</code>
+ <dd>Returns the hostent struct (name, list of aliases, list of IP
+     addresses as dotted quads (for IPv4) or coloned octets (for IPv6),
+     address type - IPv4 or IPv6).
+     When <code>host</code> is omitted or <code>:default</code>, return
+     the data for the current host.  When <code>host</code> is given and
+     is <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+     <code>nil</code></a>, all the host database is returned as a list of
+     vectors of length 4 (this would be the contents of the
+     <var>/etc/hosts</var> file on a UNIX system or
+     <var>${windir}/system32/etc/hosts</var> on a Win32 system).
+ <dt><code>(<strong>posix:file-stat</strong>
+            <var>file</var> &amp;optional <var>link-p</var>)</code>
+ <dd>Return the stat struct.  <code>file</code> can
+     be a stream, a pathname, a string or a number (on a UNIX system,
+     meaning file descriptor).  The first slot of the struct returned is
+     the string or the number on which
+     <code>stat</code>(2)/<code>fstat</code>(2)/<code>lstat</code>(2)
+     was called.  The other 13 slots are numbers, members of the stat
+     struct: device, inode, protection, number of hard links, owner's
+     UID, owner's GID, device type, total size (bytes), blocksize for
+     filesystem I/O, number of blocks allocated, atime, mtime, ctime (as
+     number of seconds since 1900-01-01).  If the system does not
+     support a particular field (e.g., Win32 does not have hard links),
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+     <code>nil</code></a> (or the default, like 1 for the number of hard
+     links for Win32 or DOS) is returned.
+     <br>[UNIX systems only at this time, patches are welcome.]
+ <dt><code>(<strong>posix:user-data</strong>
+             &amp;optional <var>user</var>)</code>
+ <dd>Return the passwd struct (name, encoded password, UID, GID, full
+     name, home directory, shell).  When <code>user</code> is <a
+     href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+     <code>nil</code></a>, return all users.  When <code>user</code> is
+     <code>:default</code> or not supplied, return the information
+     about the current user.  If the system does not support a particular
+     field (e.g., Win32 does not have a concept of a shell),
+     <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html">
+     <code>nil</code></a> (or the default, like <var>c:\command.com</var>
+     for DOS) is returned.
+     <br>[UNIX systems only at this time, patches are welcome.]
+ <dd><code>(<strong>posix:sysinfo</strong>)</code>
+ <dd>Return a struct describing the OS, derived from
+     <code>uname(2)</code> and <code>sysconf(3)</code>.
+ <dd><code>(<strong>posix:resource-usage-limits</strong>)</code>
+ <dd>Return 3 structs describing the resources usage and limits, derived
+     from <code>getrlimit(2)</code> and <code>getrusage(3)</code>.
+ <dt><code>(<strong>posix:erf</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:erfc</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:j0</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:j1</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:jn</strong> <var>int</var>
+            <var>real</var>)</code><br>
+     <code>(<strong>posix:y0</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:y1</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:yn</strong> <var>int</var>
+            <var>real</var>)</code><br>
+     <code>(<strong>posix:gamma</strong> <var>real</var>)</code><br>
+     <code>(<strong>posix:lgamma</strong> <var>real</var>)</code>
+ <dd>Compute the error functions, Bessel functions and Gamma.
+     These functions are required by the POSIX standard and should be
+     available in libm.so.  Please note that these functions do not
+     provide lisp-style error handling and precision, and all the
+     computations at the double float level.
+     <br>[UNIX systems only at this time, patches are welcome.]
+</dl>
+
+
+<a name="quickstart"></a><h3>Extensions-2.8. Quickstarting delivery with CLISP</h3>
+
+<p>This section describes four ways to turn CLISP programs into executable
+programs, which can be started as quickly as executables written in other
+languages.
+<dl>
+ <dt><strong>UNIX</strong>
+  <dd>CLISP can act as a script interpreter.
+ <dt><strong>Desktop environments</strong> such as
+     <a href="http://www.kde.org">KDE</a>,
+     <a href="http://www.gnome.org">GNOME</a>, or
+     Windows.
+  <dd>Files created with CLISP can be associated with the CLISP
+      executables so that clicking on them would make CLISP execute the
+      appropriate code.
+ <dt><strong>Linux</strong> with <code>CONFIG_BINFMT_MISC=y</code>
+  <dd>Associate the extensions <code>fas</code> and <code>lsp</code>
+      with CLISP; then you can make the files executable and run them
+      from the command line.
+ <dt><strong>Amiga</strong>
+  <dd>Files created with CLISP can be associated with a Workbench project
+      icon so that clicking on them would make CLISP execute the
+      appropriate code.  Note that several <code>fas</code> files
+      can be concatenated (using <code>Join</code>) into one file.
+</dl>
+These three techniques apply to a single <code>lsp</code> or <code>fas</code>
+file. If your application is made up of several <code>lsp</code> or
+<code>fas</code> files, you can simply concatenate them (using
+<code>cat</code>(1)) into one file; the techniques then apply to that
+concatenated file.
+
+<dl>
+<!-- #ifdef UNIX -->
+<dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+
+<dd>On Unix, a text file (<code>fas</code> or <code>lsp</code>) can be
+made executable by adding a first line of the form
+
+<pre><code>#!<var>interpreter</var> [<var>interpreter-args</var>]</code></pre>
+
+and using <code>chmod</code>(1) to make the script executable.  CLISP
+can be used as a script interpreter under the following circumstances:
+<p>
+<ol>
+<li>The <var>interpreter</var> must be a full pathname of CLISP.  I
+   recommend using <code>/usr/local/bin/clisp</code>, and if CLISP is
+   actually installed elsewhere, letting
+   <code>/usr/local/bin/clisp</code> be a symbolic link to the real
+   CLISP.
+<p>
+<li>The <var>interpreter</var> must be a real executable, not a
+   script.  Unfortunately, in the binary distributions of CLISP on
+   Solaris, <code>clisp</code> is a shell script because a C compiler
+   cannot be assumed to be installed on this platform. If you have a C
+   compiler installed, build CLISP from source yourself;
+   &#34;<code>make install</code>&#34; will install <code>clisp</code>
+   as a real executable.
+<p>
+<li>On some platforms, the first line
+   &#34;<code>#!<var>interpreter</var>
+   [<var>interpreter-args</var>]</code>&#34; is limited in length:
+   <ul>
+         <li>max. 32 characters on SunOS 4,
+         <li>max. 80 characters on HP-UX,
+         <li>max. 127 characters on Linux.
+   </ul>
+   Characters exceeding this limit are simply cut off by the system.
+   At least 128 characters are accepted on Solaris, IRIX, AIX, OSF/1.
+   There is no workaround: You have to keep the interpreter pathname
+   and arguments short.
+<p>
+<li>On Solaris and HP-UX, only the first <var>interpreter-arg</var> is
+   passed to the <var>interpreter</var>. In order to pass more than one
+   option (for example, &#34;<code>-Msomewhere.mem</code>&#34; and
+   &#34;<code>-C</code>&#34;) to <code>clisp</code>, separate them by
+   hard spaces (ISO Latin-1 character 160) instead of normal
+   spaces. (But the separator between <var>interpreter</var> and
+   <var>interpreter-args</var> must still be a normal space!) CLISP will
+   split the <var>interpreter-args</var> at hard spaces and at normal
+   spaces.
+</ol>
+
+<p>The script should contain Lisp forms, except in the #! line.  The
+file is normally loaded, through the function
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_load.html">
+<code>load</code></a>.  Before it is loaded, the variable
+<code><strong>lisp:*args*</strong></code> is bound to a list of strings,
+representing the arguments given to the Lisp script.
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+<code>*standard-input*</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+<code>*standard-output*</code></a> are bound, as usual, to the Unix standard
+input and output.  <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+<code>*error-output*</code></a> is bound to the Unix error output.
+Continuable errors will be turned to warnings.  Non-continuable errors
+and Ctrl-C interrupts will terminate the execution of the Lisp script
+with error status. If you wish the script's contents to be compiled during
+loading, add <a href="clisp.html#Option -C"><code>-C</code></a> to the
+<var>interpreter-args</var>.
+
+<p>Another, quite inferior, alternative is to put the following into a file:
+
+<pre><code>#!/bin/sh
+exec clisp &lt;&lt;EOF
+(lisp-form)
+(another-lisp-form)
+(yet-another-lisp-form)
+EOF
+</code></pre>
+
+<p>The problem with this approach is that the return values of each form
+will be printed to the standard output.  Another problem is that no user
+input will be available.
+<p><br>
+<!-- #endif -->
+
+<!-- #ifdef WIN32 -->
+<dt><em>Platform dependent: <strong>Windows</strong> platforms only.</em>
+
+<dd>There are two different ways to make CLISP "executables" for
+Windows platforms.
+
+<ul>
+ <li>Associate the <code>mem</code> extension with
+     <code>"c:\clisp\lisp.exe -m 10M -M %s -N c:\clisp\locale"</code>.
+ <li>Associate the <code>fas</code> extension with
+     <code>"c:\clisp\lisp.exe -m 10M -M c:\clisp\lispinit.mem -N c:\clisp\locale -i %s"</code>.
+     Alternatively, you may want to have a function <code>main</code> in
+     your files and associate the <code>fas</code> extension with
+     <code>"c:\clisp\lisp.exe -m 10M -M c:\clisp\lispinit.mem -N c:\clisp\locale -i %s
+            -x (main)"</code>.
+</ul>
+
+<p>Then clicking on the compiled lisp file (with <code>fas</code>
+extension) will load the file (thus executing all the code in the file),
+while the clicking on a CLISP memory image (with <code>mem</code>
+extension) will start clisp with the given <a href="#image">memory
+image</a>.
+<p><br>
+<!-- #endif -->
+
+<dt><em>Platform dependent: <strong>Linux</strong> platforms only.</em>
+
+<dd>You have to build your kernel with <code>CONFIG_BINFMT_MISC=y</code>
+and <code>CONFIG_PROC_FS=y</code>.  Then you will have a
+<code>/proc/sys/fs/binfmt_misc/</code> directory and you will be able to
+do (as <code>root</code>; you might want to put these lines into
+<code>/etc/rc.d/rc.local</code>):
+
+<pre><code><strong>bash#</strong> echo ":CLISP:E::fas::/usr/bin/clisp:" &gt;&gt; /proc/sys/fs/binfmt_misc/register
+<strong>bash#</strong> echo ":CLISP:E::lsp::/usr/bin/clisp:" &gt;&gt; /proc/sys/fs/binfmt_misc/register</code></pre>
+
+<p>Then you can do the following:
+<pre><code><strong>bash$</strong> cat &lt;&lt; EOF &gt; hello.lsp
+(print "hello, world!")
+EOF
+<strong>bash$</strong> clisp -c hello.lsp
+
+Compiling file /home/sds/hello.lsp ...
+
+Compilation of file /home/sds/hello.lsp is finished.
+0 errors, 0 warnings
+<strong>bash$</strong> chmod +x hello.fas
+<strong>bash$</strong> hello.fas
+
+"hello, world!"
+<strong>bash$</strong>
+</code></pre>
+
+<p>Please read <code>/usr/src/linux/Documentation/binfmt_misc.txt</code>
+for details.
+
+<p><br>
+<!-- #ifdef AMIGAOS -->
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+
+<dd>Using a Workbench project file, the memory images, source and binary
+files can be made "executable".
+
+<ul>
+ <li>Using IconEdit, create a project icon.
+ <li>Set the tool to <code>lisp:lisp.run</code> (or wherever the binary is
+     located).
+ <li>Define a tooltype named <code>ARGS</code> set to <code>-M *</code>
+     for a memory image project icon or to <code>-M lisp:lispinit.mem
+     -i *</code> for a source or compiled lisp file.  The startup code
+     will replace an isolated <code>*</code> token with the file name.
+ <li>Alternatively, you may want to have a function <code>main</code> in
+     your files and set the <code>ARGS</code> tooltype to
+     <code>-M lisp:lispinit.mem -i * -x (main)</code>.
+ <li>You might want to add more <a href="clisp.html">command line options</a>
+     to the <code>ARGS</code> tooltype.
+</ul>
+
+<p>Clicking on the compiled lisp file (with <code>fas</code> suffix)
+will load the image and the file (thus executing all the code in the
+file), while clicking on the CLISP's memory image (with <code>mem</code>
+suffix) with start clisp with the given <a href="#image">memory
+image</a>.
+
+<p>You might want to add a tooltype named <code>WINDOW</code> which
+names the console window that
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stterminal-iost.html">
+<code>*terminal-io*</code></a> will be bound to, for example
+<code>CON:0/0/500/300/CLISP-Listener/AUTO/CLOSE</code>, or
+<code>TCP:20002</code>.
+
+<p><br>
+<!-- #endif -->
+</dl>
+
+<a name="app-dev"></a><h3>Extensions-2.9. Application delivery with CLISP</h3>
+
+<p>Some ways of packaging CLISP programs are discussed in the section
+<a href="#quickstart">Quickstarting delivery with CLISP</a>.
+
+<p>CLISP is Free Software, covered by the GNU GPL, with special terms governing
+the distribution of applications that run in CLISP. The precise terms can be
+found in the COPYRIGHT file contained in the source and binary distributions
+of CLISP. Here is an informal clarification what these terms mean in practice.
+Please refer to the said COPYRIGHT file when in doubt.
+
+<p>In many cases, CLISP does not force an application to be covered by the
+GNU GPL. Nevertheless, we encourage you to release your software under an
+open source copyright. The benefits of such a copyright for your users are
+numerous, in particular they are free to modify the application when their
+needs/requirements change, and they are free to recompile the application
+when they upgrade their machine or operating system.
+
+<p>CLISP extensions, i.e. programs which need to access non-portable CLISP
+internal symbols (in the packages SYSTEM, COMPILER, CLOS, FFI, ...), must
+be covered by GNU GPL as well.
+
+<p>Other programs running in CLISP have to or need not to be placed under
+GNU GPL, depending on their distribution form:
+<ul>
+  <li>Programs distributed as Lisp source of .fas files can be distributed
+      without restrictions coming from CLISP.
+  <li>Programs distributed as CLISP memory images can be distributed
+      only if accompanied with the non-CLISP .fas files which make up the
+      memory image, and a Makefile for rebuilding the memory image.
+  <li>If you need to distribute a modified CLISP executable (for example,
+      incorporating additional modules written in C), you must distribute
+      its full source under GNU GPL. If you are not satisfied with this,
+      you can instead put the additional modules into a separate (non-CLISP)
+      program, with which your Lisp program will communicate via sockets.
+</ul>
+
+<a name="shell"></a><h3>Extensions-2.10. Shell Access</h3>
+
+<dl>
+<!-- #if defined(UNIX) || defined(MSDOS) || defined(RISCOS) -->
+ <dt><em>Platform dependent: <strong>UNIX</strong>,
+     <strong>DOS</strong>, <strong>OS/2</strong>,
+     <strong>Acorn</strong> platforms only.</em>
+  <dd><code>(<strong>lisp:execute</strong> <var>programfile</var>
+   <var>arg<sub>1</sub></var> <var>arg<sub>2</sub></var> ...)</code>
+   executes an external program. Its name is <var>programfile</var>. It is
+   given the strings <var>arg<sub>1</sub></var>,
+   <var>arg<sub>2</sub></var>, ... as arguments.
+<!-- #endif -->
+<!-- #ifdef AMIGAOS -->
+ <dt><em>Platform dependent: <strong>Amiga</strong> platforms only.</em>
+  <dd><code>(<strong>lisp:execute</strong> <var>command</var>)</code>
+   executes a given <var>command</var> using the operating system's
+   shell.
+<!-- #endif -->
+</dl>
+
+<!-- #ifdef HAVE_SHELL -->
+<dl>
+ <dt><em>Platform dependent: <strong>UNIX</strong>,
+   <strong>DOS</strong>, <strong>OS/2</strong>, <strong>Win32</strong>,
+   <strong>Amiga</strong>, <strong>Acorn</strong> platforms only.</em>
+  <dd><code>(<strong>lisp:shell</strong> [<var>command</var>])</code>
+   calls the operating system's shell. <code>(lisp:shell)</code> calls
+   the shell for interactive use. <code>(lisp:shell
+   <var>command</var>)</code> calls the shell only for execution of the
+   one given <var>command</var>.
+</dl>
+<!-- #endif -->
+<!-- #ifdef PIPES2 -->
+<dl>
+ <dt><em>Platform dependent: <strong>UNIX</strong>,
+     <strong>OS/2</strong>, <strong>Win32</strong> platforms only.</em>
+  <dd>The functions <code><strong>lisp:run-shell-command</strong></code>
+   and <code><strong>lisp:run-program</strong></code> are a general
+   interface to <code><strong>lisp:shell</strong></code> and the above:
+   <p><code>(<strong>run-shell-command</strong> <var>command</var>
+    [:input] [:output] [:if-output-exists])</code> runs a shell command.
+   <p><code>(<strong>run-program</strong> <var>program</var>
+    [:arguments] [:input] [:output] [:if-output-exists])</code>
+    runs an external program.
+<p><dl>
+<dt><var>command</var> <dd>the shell command.
+<!-- #ifdef UNIX -->
+ <dl>
+  <dt><em>Platform dependent: <strong>UNIX</strong> platforms only.</em>
+  <dd>The shell the command is passed to is the value of the environment
+   variable <code>SHELL</code>, which normally is
+   <code>/bin/sh</code>.  The command should be a ``simple command''; a
+   ``command list'' should be enclosed in "{ ... ; }" (for
+   <code>/bin/sh</code>) or "( ... )" (for <code>/bin/csh</code>).
+ </dl>
+<!-- #endif -->
+ <dt><var>program</var>
+  <dd>the program.  The directories listed in the
+   <code>PATH</code> environment variable will be searched for it.
+ <dt><code>:arguments</code>
+  <dd>a list of arguments (strings) that are given to the program.
+ <dt><code>:input</code>
+  <dd>where the program's input is to come from: either
+   <code>:terminal</code> (the standard input) or <code>:stream</code>
+   (a Lisp stream to be created) or a pathname (an input file) or
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+   (no input at all).
+ <dt><code>:output</code>
+  <dd>where the program's output is to be sent to: either
+   <code>:terminal</code> (the standard output) or <code>:stream</code>
+   (a Lisp stream to be created) or a pathname (an output file) or
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/convar_nil.html"><code>nil</code></a>
+   (ignore the output).
+ <dt><code>:if-output-exists</code>
+  <dd>what to do if the <code>:output</code> file already
+   exists. The possible values are <code>:overwrite</code>,
+   <code>:append</code>, <code>:error</code>, with the same meaning as for
+   <a href="http://www.harlequin.com/education/books/HyperSpec/Body/fun_open.html">
+   <code>open</code></a>.
+ </dl>
+
+<p>If <code>:stream</code> was specified for <code>:input</code> or
+<code>:output</code>, a Lisp stream is returned.  If
+<code>:stream</code> was specified for <code>:input</code> and
+<code>:output</code>, three Lisp streams are returned, as for the
+function <a href="#pipe"><code>lisp:make-pipe-io-stream</code></a>.
+This use of <code>lisp:run-program</code> can cause deadlocks, see <a
+href="#pipe"><code>lisp:make-pipe-io-stream</code></a>.
+</dl>
+<p>
+<!-- #endif -->
+
+<!-- #ifdef AMIGAOS -->
+<a name="other"></a><h3>Extensions-2.11. Other</h3>
+
+<dl>
+<dt><em>Platform dependent: <strong>Amiga</strong> platforms only.
+</em>
+<dd>
+To have <a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+<code>*debug-io*</code></a> and
+<a href="http://www.harlequin.com/education/books/HyperSpec/Body/var_stdebug-i_ace-outputst.html">
+<code>*error-output*</code></a> point to separate console windows (thus
+keeping your standard console window clean from error messages) you can use
+<pre>
+<code>  (setq *error-output*
+    (setq *debug-io*
+      (open "CON:0/0/500/300/CLISP-Debugger/AUTO/CLOSE" :direction :io)
+  ) )
+</code></pre>
+at startup.
+</dl>
+<!-- #endif -->
+<!-- #endif -->
+
+<h2>Authors</h2>
+
+<table>
+<tr> <td> <td>Bruno Haible                  <td> <td> <td>Michael Stoll
+<tr> <td> <td>17, rue Danton                <td> <td> <td>Westerwaldweg 22
+<tr> <td>F - <td>94270 Le Kremlin-Bic&ecirc;tre<td width=50>  <td>D - <td>53424 Remagen-Oberwinter
+<tr> <td> <td>France                        <td> <td> <td>Germany
+</table>
+
+<h2>Current Maintainers</h2>
+<ul>
+  <li><em>haible@clisp.cons.org</em>
+  <li><em>sds@clisp.cons.org</em>
+</ul>
+
+<hr>
+
+<h3>CLISP implementation notes</h3>
+
+<a href="mailto:haible@clisp.cons.org">Bruno Haible</a><br>
+<a href="mailto:sds@clisp.cons.org">Sam Steingold</a>
+
+<p>Bugs in both these notes and CLISP itself should be sent to:
+ <address><a href="mailto:clisp-list@lists.sourceforge.net">
+ &lt;clisp-list@lists.sourceforge.net&gt;</a></address>
+
+<p><center>
+<a href="http://validator.w3.org/">Valid HTML 3.2!</a>
+<!-- <img border=0 src="http://validator.w3.org/images/vh32.gif"
+     alt="Valid HTML 3.2!" height=31 width=88> -->
+</center>
+
+</body>
+</html>
+<!--
+Local Variables:
+compile-command: "weblint -d container-whitespace,empty-container _impnotes.html"
+time-stamp-start: "<strong>Last modified: "
+time-stamp-end: "</strong><br>"
+time-stamp-format: "%:y-%02m-%02d"
+time-stamp-line-limit: 100
+sentence-end-double-space: t
+eval: (add-hook 'write-file-hooks 'time-stamp)
+end:
+-->