Lots of small changes collected over months...
diff --git a/Doc/Makefile b/Doc/Makefile
index 64b029e..e55871b 100644
--- a/Doc/Makefile
+++ b/Doc/Makefile
@@ -31,7 +31,7 @@
 	bibtex qua
 	latex qua
 	latex qua
-	dvips lib >qua.ps
+	dvips qua >qua.ps
 
 libinfo:
 	@echo This may take a while...
diff --git a/Doc/ref/ref3.tex b/Doc/ref/ref3.tex
index 96eaa1d..2d3b1e8 100644
--- a/Doc/ref/ref3.tex
+++ b/Doc/ref/ref3.tex
@@ -290,10 +290,17 @@
 \begin{description}
 
 \item[Dictionaries]
-These represent finite sets of objects indexed by strings.
+These represent finite sets of objects indexed by almost arbitrary
+values.  The only types of values not acceptable as keys are values
+containing lists or dictionaries or other mutable types that are
+compared by value rather than by object identity --- the reason being
+that the implementation requires that a key's hash value be constant.
+Numeric types used for keys obey the normal rules for numeric
+comparison: if two numbers compare equal (e.g. 1 and 1.0) then they
+can be used interchangeably to index the same dictionary entry.
+
 Dictionaries are mutable; they are created by the \verb\{...}\
-notation (see section \ref{dict}).  (Implementation note: the strings
-used for indexing must not contain null bytes.)
+notation (see section \ref{dict}).
 \obindex{dictionary}
 \obindex{mutable}
 
@@ -409,7 +416,7 @@
 \obindex{instance}
 \indexii{class object}{call}
 \index{container}
-\index{dictionary}
+\obindex{dictionary}
 \indexii{class}{attribute}
 
 Class attribute assignments update the class's dictionary, never the
@@ -589,12 +596,30 @@
 Called by the \verb\print\ statement and conversions (reverse quotes) to
 compute the string representation of an object.
 
-\item[\tt _cmp__(self, other)]
+\item[\tt __cmp__(self, other)]
 Called by all comparison operations.  Should return -1 if
 \verb\self < other\,  0 if \verb\self == other\, +1 if
-\verb\self > other\.  (Implementation note: due to limitations in the
-interpreter, exceptions raised by comparisons are ignored, and the
-objects will be considered equal in this case.)
+\verb\self > other\.  If no \code{__cmp__} operation is defined, class
+instances are compared by object identity (``address'').
+(Implementation note: due to limitations in the interpreter,
+exceptions raised by comparisons are ignored, and the objects will be
+considered equal in this case.)
+
+\item[\tt __hash__(self)]
+Called by dictionary operations and by the built-in function
+\code{hash()}.  Should return a 32-bit integer usable as a hash value
+for dictionary operations.  The only required property is that objects
+which compare equal have the same hash value; it is advised to somehow
+mix together (e.g. using exclusing or) the hash values for the
+components of the object that also play a part in comparison of
+objects.  If a class does not define a \code{__cmp__} method it should
+not define a \code{__hash__} operation either; if it defines
+\code{__cmp__} but not \code{__hash__} its instances will not be
+usable as dictionary keys.  If a class defines mutable objects and
+implements a \code{__cmp__} method it should not implement
+\code{__hash__}, since the dictionary implementation assumes that a
+key's hash value is a constant.
+\obindex{dictionary}
 
 \end{description}
 
diff --git a/Doc/ref/ref5.tex b/Doc/ref/ref5.tex
index 7857e95..59ba90a 100644
--- a/Doc/ref/ref5.tex
+++ b/Doc/ref/ref5.tex
@@ -176,8 +176,9 @@
 entries of the dictionary: each key object is used as a key into the
 dictionary to store the corresponding datum.
 
-Keys must be strings, otherwise a \verb\TypeError\ exception is
-raised.  Clashes between duplicate keys are not detected; the last
+Restrictions on the types of the key values are listed earlier in
+section \ref{types}.
+Clashes between duplicate keys are not detected; the last
 datum (textually rightmost in the display) stored for a given key
 value prevails.
 \exindex{TypeError}
@@ -565,10 +566,10 @@
 Mappings (dictionaries) are compared through lexicographic
 comparison of their sorted (key, value) lists.%
 \footnote{This is expensive since it requires sorting the keys first,
-but about the only sensible definition.  It was tried to compare
-dictionaries by identity only, but this caused surprises because
-people expected to be able to test a dictionary for emptiness by
-comparing it to {\tt \{\}}.}
+but about the only sensible definition.  An earlier version of Python
+compared dictionaries by identity only, but this caused surprises
+because people expected to be able to test a dictionary for emptiness
+by comparing it to {\tt \{\}}.}
 
 \item
 Most other types compare unequal unless they are the same object;
diff --git a/Doc/ref3.tex b/Doc/ref3.tex
index 96eaa1d..2d3b1e8 100644
--- a/Doc/ref3.tex
+++ b/Doc/ref3.tex
@@ -290,10 +290,17 @@
 \begin{description}
 
 \item[Dictionaries]
-These represent finite sets of objects indexed by strings.
+These represent finite sets of objects indexed by almost arbitrary
+values.  The only types of values not acceptable as keys are values
+containing lists or dictionaries or other mutable types that are
+compared by value rather than by object identity --- the reason being
+that the implementation requires that a key's hash value be constant.
+Numeric types used for keys obey the normal rules for numeric
+comparison: if two numbers compare equal (e.g. 1 and 1.0) then they
+can be used interchangeably to index the same dictionary entry.
+
 Dictionaries are mutable; they are created by the \verb\{...}\
-notation (see section \ref{dict}).  (Implementation note: the strings
-used for indexing must not contain null bytes.)
+notation (see section \ref{dict}).
 \obindex{dictionary}
 \obindex{mutable}
 
@@ -409,7 +416,7 @@
 \obindex{instance}
 \indexii{class object}{call}
 \index{container}
-\index{dictionary}
+\obindex{dictionary}
 \indexii{class}{attribute}
 
 Class attribute assignments update the class's dictionary, never the
@@ -589,12 +596,30 @@
 Called by the \verb\print\ statement and conversions (reverse quotes) to
 compute the string representation of an object.
 
-\item[\tt _cmp__(self, other)]
+\item[\tt __cmp__(self, other)]
 Called by all comparison operations.  Should return -1 if
 \verb\self < other\,  0 if \verb\self == other\, +1 if
-\verb\self > other\.  (Implementation note: due to limitations in the
-interpreter, exceptions raised by comparisons are ignored, and the
-objects will be considered equal in this case.)
+\verb\self > other\.  If no \code{__cmp__} operation is defined, class
+instances are compared by object identity (``address'').
+(Implementation note: due to limitations in the interpreter,
+exceptions raised by comparisons are ignored, and the objects will be
+considered equal in this case.)
+
+\item[\tt __hash__(self)]
+Called by dictionary operations and by the built-in function
+\code{hash()}.  Should return a 32-bit integer usable as a hash value
+for dictionary operations.  The only required property is that objects
+which compare equal have the same hash value; it is advised to somehow
+mix together (e.g. using exclusing or) the hash values for the
+components of the object that also play a part in comparison of
+objects.  If a class does not define a \code{__cmp__} method it should
+not define a \code{__hash__} operation either; if it defines
+\code{__cmp__} but not \code{__hash__} its instances will not be
+usable as dictionary keys.  If a class defines mutable objects and
+implements a \code{__cmp__} method it should not implement
+\code{__hash__}, since the dictionary implementation assumes that a
+key's hash value is a constant.
+\obindex{dictionary}
 
 \end{description}
 
diff --git a/Doc/ref5.tex b/Doc/ref5.tex
index 7857e95..59ba90a 100644
--- a/Doc/ref5.tex
+++ b/Doc/ref5.tex
@@ -176,8 +176,9 @@
 entries of the dictionary: each key object is used as a key into the
 dictionary to store the corresponding datum.
 
-Keys must be strings, otherwise a \verb\TypeError\ exception is
-raised.  Clashes between duplicate keys are not detected; the last
+Restrictions on the types of the key values are listed earlier in
+section \ref{types}.
+Clashes between duplicate keys are not detected; the last
 datum (textually rightmost in the display) stored for a given key
 value prevails.
 \exindex{TypeError}
@@ -565,10 +566,10 @@
 Mappings (dictionaries) are compared through lexicographic
 comparison of their sorted (key, value) lists.%
 \footnote{This is expensive since it requires sorting the keys first,
-but about the only sensible definition.  It was tried to compare
-dictionaries by identity only, but this caused surprises because
-people expected to be able to test a dictionary for emptiness by
-comparing it to {\tt \{\}}.}
+but about the only sensible definition.  An earlier version of Python
+compared dictionaries by identity only, but this caused surprises
+because people expected to be able to test a dictionary for emptiness
+by comparing it to {\tt \{\}}.}
 
 \item
 Most other types compare unequal unless they are the same object;
diff --git a/Doc/tut.tex b/Doc/tut.tex
index 2535808..a51fb83 100644
--- a/Doc/tut.tex
+++ b/Doc/tut.tex
@@ -183,6 +183,12 @@
 usually what you want) they are satisfied from whatever file or device
 is connected to standard input of the Python interpreter.
 
+When a script file is used, it is sometimes useful to be able to run
+the script and enter interactive mode afterwards.  This can be done by
+passing {\tt -i} before the script.  (This does not work if the script
+is read from standard input, for the same reason as explained in the
+previous paragraph.)
+
 \subsection{Argument Passing}
 
 When known to the interpreter, the script name and additional
@@ -211,8 +217,8 @@
 
 \bcode\begin{verbatim}
 python
-Python 0.9.7 (Aug 28 1992).
-Copyright 1990, 1991, 1992 Stichting Mathematisch Centrum, Amsterdam
+Python 0.9.9 (Apr  2 1993).
+Copyright 1990, 1991, 1992, 1993 Stichting Mathematisch Centrum, Amsterdam
 >>>
 \end{verbatim}\ecode
 
@@ -1748,58 +1754,44 @@
 
 \bcode\small\begin{verbatim}
 >>> 10 * (1/0)
-Unhandled exception: run-time error: integer division by zero
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+ZeroDivisionError: integer division or modulo
 >>> 4 + foo*3
-Unhandled exception: undefined name: foo
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+NameError: foo
 >>> '2' + 2
-Unhandled exception: type error: illegal argument type for built-in operation
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+TypeError: illegal argument type for built-in operation
 >>> 
 \end{verbatim}\ecode
 %
-The first line of the error message indicates what happened.
+The last line of the error message indicates what happened.
 Exceptions come in different types, and the type is printed as part of
 the message: the types in the example are
-{\tt run-time error},
-{\tt undefined name}
+{\tt ZeroDivisionError},
+{\tt NameError}
 and
-{\tt type error}.
-The rest of the line is a detail whose interpretation depends on the
-exception type.
+{\tt TypeError}.
+The string printed as the exception type is the name of the built-in
+name for the exception that occurred.  This is true for all built-in
+exceptions, but need not be true for user-defined exceptions (although
+it is a useful convention).
+Standard exception names are built-in identifiers (not reserved
+keywords).
 
-The rest of the error message shows the context where the
-exception happened.
+The rest of the line is a detail whose interpretation depends on the
+exception type; its meaning is dependent on the exception type.
+
+The preceding part of the error message shows the context where the
+exception happened, in the form of a stack backtrace.
 In general it contains a stack backtrace listing source lines; however,
 it will not display lines read from standard input.
 
-Here is a summary of the most common exceptions:
-\begin{itemize}
-\item
-{\em Run-time\ errors}
-are generally caused by wrong data used by the program; this can be the
-programmer's fault or caused by bad input.
-The detail states the cause of the error in more detail.
-\item
-{\em Undefined\ name}
-errors are more serious: these are usually caused by misspelled
-identifiers.%
-\footnote{
-	The parser does not check whether names used in a program are at
-	all defined elsewhere in the program; such checks are
-	postponed until run-time.  The same holds for type checking.
-}
-The detail is the offending identifier.
-\item
-{\em Type\ errors} are also pretty serious: this is another case of
-using wrong data (or better, using data the wrong way), but here the
-error can be gleaned from the object type(s) alone.  The detail shows
-in what context the error was detected.
-\end{itemize}
+The Python library reference manual lists the built-in exceptions and
+their meanings.
 
 \section{Handling Exceptions}
 
@@ -1813,7 +1805,7 @@
 ...     print x,
 ...     try:
 ...         print 1.0 / x
-...     except RuntimeError:
+...     except ZeroDivisionError:
 ...         print '*** has no inverse ***'
 ... 
 0.3333 3.00030003
@@ -1862,7 +1854,8 @@
 %
 The last except clause may omit the exception name(s), to serve as a
 wildcard.
-Use this with extreme caution!
+Use this with extreme caution, since it is easy to mask a real
+programming error in this way!
 
 When an exception occurs, it may have an associated value, also known as
 the exceptions's
@@ -1882,31 +1875,9 @@
 >>> 
 \end{verbatim}\ecode
 %
-If an exception has an argument, it is printed as the third part
+If an exception has an argument, it is printed as the last part
 (`detail') of the message for unhandled exceptions.
 
-Standard exception names are built-in identifiers (not reserved
-keywords).
-These are in fact string objects whose
-{\em object\ identity}
-(not their value!) identifies the exceptions.
-The string is printed as the second part of the message for unhandled
-exceptions.
-Their names and values are:
-
-\bcode\begin{verbatim}
-EOFError              'end-of-file read'
-KeyboardInterrupt     'keyboard interrupt'
-MemoryError           'out of memory'           *
-NameError             'undefined name'          *
-RuntimeError          'run-time error'          *
-SystemError           'system error'            *
-TypeError             'type error'              *
-\end{verbatim}\ecode
-%
-The meanings should be clear enough.
-Those exceptions with a {\tt *} in the third column have an argument.
-
 Exception handlers don't just handle exceptions if they occur
 immediately in the try clause, but also if they occur inside functions
 that are called (even indirectly) in the try clause.
@@ -1918,10 +1889,10 @@
 ... 
 >>> try:
 ...     this_fails()
-... except RuntimeError, detail:
+... except ZeroDivisionError, detail:
 ...     print 'Handling run-time error:', detail
 ... 
-Handling run-time error: integer division by zero
+Handling run-time error: integer division or modulo
 >>> 
 \end{verbatim}\ecode
 
@@ -1932,10 +1903,10 @@
 For example:
 
 \bcode\begin{verbatim}
->>> raise NameError, 'Hi There!'
-Unhandled exception: undefined name: Hi There!
+>>> raise NameError, 'HiThere'
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+NameError: HiThere
 >>> 
 \end{verbatim}\ecode
 %
@@ -1949,7 +1920,7 @@
 For example:
 
 \bcode\begin{verbatim}
->>> my_exc = 'Nobody likes me'
+>>> my_exc = 'my_exc'
 >>> try:
 ...     raise my_exc, 2*2
 ... except my_exc, val:
@@ -1957,9 +1928,9 @@
 ... 
 My exception occured, value: 4
 >>> raise my_exc, 1
-Nobody likes me: 1
 Stack backtrace (innermost last):
   File "<stdin>", line 7
+my_exc: 1
 >>> 
 \end{verbatim}\ecode
 %
@@ -1979,9 +1950,9 @@
 ...     print 'Goodbye, world!'
 ... 
 Goodbye, world!
-Unhandled exception: keyboard interrupt
 Stack backtrace (innermost last):
   File "<stdin>", line 2
+KeyboardInterrupt
 >>> 
 \end{verbatim}\ecode
 %
diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex
index 2535808..a51fb83 100644
--- a/Doc/tut/tut.tex
+++ b/Doc/tut/tut.tex
@@ -183,6 +183,12 @@
 usually what you want) they are satisfied from whatever file or device
 is connected to standard input of the Python interpreter.
 
+When a script file is used, it is sometimes useful to be able to run
+the script and enter interactive mode afterwards.  This can be done by
+passing {\tt -i} before the script.  (This does not work if the script
+is read from standard input, for the same reason as explained in the
+previous paragraph.)
+
 \subsection{Argument Passing}
 
 When known to the interpreter, the script name and additional
@@ -211,8 +217,8 @@
 
 \bcode\begin{verbatim}
 python
-Python 0.9.7 (Aug 28 1992).
-Copyright 1990, 1991, 1992 Stichting Mathematisch Centrum, Amsterdam
+Python 0.9.9 (Apr  2 1993).
+Copyright 1990, 1991, 1992, 1993 Stichting Mathematisch Centrum, Amsterdam
 >>>
 \end{verbatim}\ecode
 
@@ -1748,58 +1754,44 @@
 
 \bcode\small\begin{verbatim}
 >>> 10 * (1/0)
-Unhandled exception: run-time error: integer division by zero
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+ZeroDivisionError: integer division or modulo
 >>> 4 + foo*3
-Unhandled exception: undefined name: foo
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+NameError: foo
 >>> '2' + 2
-Unhandled exception: type error: illegal argument type for built-in operation
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+TypeError: illegal argument type for built-in operation
 >>> 
 \end{verbatim}\ecode
 %
-The first line of the error message indicates what happened.
+The last line of the error message indicates what happened.
 Exceptions come in different types, and the type is printed as part of
 the message: the types in the example are
-{\tt run-time error},
-{\tt undefined name}
+{\tt ZeroDivisionError},
+{\tt NameError}
 and
-{\tt type error}.
-The rest of the line is a detail whose interpretation depends on the
-exception type.
+{\tt TypeError}.
+The string printed as the exception type is the name of the built-in
+name for the exception that occurred.  This is true for all built-in
+exceptions, but need not be true for user-defined exceptions (although
+it is a useful convention).
+Standard exception names are built-in identifiers (not reserved
+keywords).
 
-The rest of the error message shows the context where the
-exception happened.
+The rest of the line is a detail whose interpretation depends on the
+exception type; its meaning is dependent on the exception type.
+
+The preceding part of the error message shows the context where the
+exception happened, in the form of a stack backtrace.
 In general it contains a stack backtrace listing source lines; however,
 it will not display lines read from standard input.
 
-Here is a summary of the most common exceptions:
-\begin{itemize}
-\item
-{\em Run-time\ errors}
-are generally caused by wrong data used by the program; this can be the
-programmer's fault or caused by bad input.
-The detail states the cause of the error in more detail.
-\item
-{\em Undefined\ name}
-errors are more serious: these are usually caused by misspelled
-identifiers.%
-\footnote{
-	The parser does not check whether names used in a program are at
-	all defined elsewhere in the program; such checks are
-	postponed until run-time.  The same holds for type checking.
-}
-The detail is the offending identifier.
-\item
-{\em Type\ errors} are also pretty serious: this is another case of
-using wrong data (or better, using data the wrong way), but here the
-error can be gleaned from the object type(s) alone.  The detail shows
-in what context the error was detected.
-\end{itemize}
+The Python library reference manual lists the built-in exceptions and
+their meanings.
 
 \section{Handling Exceptions}
 
@@ -1813,7 +1805,7 @@
 ...     print x,
 ...     try:
 ...         print 1.0 / x
-...     except RuntimeError:
+...     except ZeroDivisionError:
 ...         print '*** has no inverse ***'
 ... 
 0.3333 3.00030003
@@ -1862,7 +1854,8 @@
 %
 The last except clause may omit the exception name(s), to serve as a
 wildcard.
-Use this with extreme caution!
+Use this with extreme caution, since it is easy to mask a real
+programming error in this way!
 
 When an exception occurs, it may have an associated value, also known as
 the exceptions's
@@ -1882,31 +1875,9 @@
 >>> 
 \end{verbatim}\ecode
 %
-If an exception has an argument, it is printed as the third part
+If an exception has an argument, it is printed as the last part
 (`detail') of the message for unhandled exceptions.
 
-Standard exception names are built-in identifiers (not reserved
-keywords).
-These are in fact string objects whose
-{\em object\ identity}
-(not their value!) identifies the exceptions.
-The string is printed as the second part of the message for unhandled
-exceptions.
-Their names and values are:
-
-\bcode\begin{verbatim}
-EOFError              'end-of-file read'
-KeyboardInterrupt     'keyboard interrupt'
-MemoryError           'out of memory'           *
-NameError             'undefined name'          *
-RuntimeError          'run-time error'          *
-SystemError           'system error'            *
-TypeError             'type error'              *
-\end{verbatim}\ecode
-%
-The meanings should be clear enough.
-Those exceptions with a {\tt *} in the third column have an argument.
-
 Exception handlers don't just handle exceptions if they occur
 immediately in the try clause, but also if they occur inside functions
 that are called (even indirectly) in the try clause.
@@ -1918,10 +1889,10 @@
 ... 
 >>> try:
 ...     this_fails()
-... except RuntimeError, detail:
+... except ZeroDivisionError, detail:
 ...     print 'Handling run-time error:', detail
 ... 
-Handling run-time error: integer division by zero
+Handling run-time error: integer division or modulo
 >>> 
 \end{verbatim}\ecode
 
@@ -1932,10 +1903,10 @@
 For example:
 
 \bcode\begin{verbatim}
->>> raise NameError, 'Hi There!'
-Unhandled exception: undefined name: Hi There!
+>>> raise NameError, 'HiThere'
 Stack backtrace (innermost last):
   File "<stdin>", line 1
+NameError: HiThere
 >>> 
 \end{verbatim}\ecode
 %
@@ -1949,7 +1920,7 @@
 For example:
 
 \bcode\begin{verbatim}
->>> my_exc = 'Nobody likes me'
+>>> my_exc = 'my_exc'
 >>> try:
 ...     raise my_exc, 2*2
 ... except my_exc, val:
@@ -1957,9 +1928,9 @@
 ... 
 My exception occured, value: 4
 >>> raise my_exc, 1
-Nobody likes me: 1
 Stack backtrace (innermost last):
   File "<stdin>", line 7
+my_exc: 1
 >>> 
 \end{verbatim}\ecode
 %
@@ -1979,9 +1950,9 @@
 ...     print 'Goodbye, world!'
 ... 
 Goodbye, world!
-Unhandled exception: keyboard interrupt
 Stack backtrace (innermost last):
   File "<stdin>", line 2
+KeyboardInterrupt
 >>> 
 \end{verbatim}\ecode
 %