Completed missing parts.  Restructured ch. 3/4 to Data and Execution
model.  Added index.
diff --git a/Doc/ref.tex b/Doc/ref.tex
index 823df62..7a9fd5c 100644
--- a/Doc/ref.tex
+++ b/Doc/ref.tex
@@ -9,6 +9,9 @@
 	E-mail: {\tt guido@cwi.nl}
 }
 
+% Tell \index to actually write the .idx file
+\makeindex
+
 \begin{document}
 
 \pagenumbering{roman}
@@ -65,17 +68,19 @@
 to the average reader, but will leave room for ambiguities.
 Consequently, if you were coming from Mars and tried to re-implement
 Python from this document alone, you might have to guess things and in
-fact you would be implementing quite a different language.
+fact you would probably end up implementing quite a different language.
 On the other hand, if you are using
 Python and wonder what the precise rules about a particular area of
-the language are, you should definitely be able to find it here.
+the language are, you should definitely be able to find them here.
 
 It is dangerous to add too many implementation details to a language
-reference document -- the implementation may change, and other
+reference document --- the implementation may change, and other
 implementations of the same language may work differently.  On the
 other hand, there is currently only one Python implementation, and
 its particular quirks are sometimes worth being mentioned, especially
-where the implementation imposes additional limitations.
+where the implementation imposes additional limitations.  Therefore,
+you'll find short ``implementation notes'' sprinkled throughout the
+text.
 
 Every Python implementation comes with a number of built-in and
 standard modules.  These are not documented here, but in the separate
@@ -87,6 +92,10 @@
 
 The descriptions of lexical analysis and syntax use a modified BNF
 grammar notation.  This uses the following style of definition:
+\index{BNF}
+\index{grammar}
+\index{syntax}
+\index{notation}
 
 \begin{verbatim}
 name:           lc_letter (lc_letter | "_")*
@@ -96,7 +105,7 @@
 The first line says that a \verb\name\ is an \verb\lc_letter\ followed by
 a sequence of zero or more \verb\lc_letter\s and underscores.  An
 \verb\lc_letter\ in turn is any of the single characters `a' through `z'.
-(This rule is actually adhered to for the names defined in syntax and
+(This rule is actually adhered to for the names defined in lexical and
 grammar rules in this document.)
 
 Each rule begins with a name (which is the name defined by the rule)
@@ -119,18 +128,25 @@
 characters.  A phrase between angular brackets (\verb\<...>\) gives an
 informal description of the symbol defined; e.g., this could be used
 to describe the notion of `control character' if needed.
+\index{lexical definitions}
+\index{ASCII}
 
 Even though the notation used is almost the same, there is a big
 difference between the meaning of lexical and syntactic definitions:
 a lexical definition operates on the individual characters of the
 input source, while a syntax definition operates on the stream of
-tokens generated by the lexical analysis.
+tokens generated by the lexical analysis.  All uses of BNF in the next
+chapter (``Lexical Analysis'') are lexical definitions; uses in
+subsequenc chapter are syntactic definitions.
 
 \chapter{Lexical analysis}
 
 A Python program is read by a {\em parser}.  Input to the parser is a
 stream of {\em tokens}, generated by the {\em lexical analyzer}.  This
 chapter describes how the lexical analyzer breaks a file into tokens.
+\index{lexical analysis}
+\index{parser}
+\index{token}
 
 \section{Line structure}
 
@@ -138,6 +154,9 @@
 a logical line is represented by the token NEWLINE.  Statements cannot
 cross logical line boundaries except where NEWLINE is allowed by the
 syntax (e.g., between statements in compound statements).
+\index{line structure}
+\index{logical line}
+\index{NEWLINE token}
 
 \subsection{Comments}
 
@@ -145,6 +164,10 @@
 a string literal, and ends at the end of the physical line.  A comment
 always signifies the end of the logical line.  Comments are ignored by
 the syntax.
+\index{comment}
+\index{logical line}
+\index{physical line}
+\index{hash character}
 
 \subsection{Line joining}
 
@@ -153,6 +176,9 @@
 in a backslash that is not part of a string literal or comment, it is
 joined with the following forming a single logical line, deleting the
 backslash and the following end-of-line character.  For example:
+\index{physical line}
+\index{line joining}
+\index{backslash character}
 %
 \begin{verbatim}
 moth_names = ['Januari', 'Februari', 'Maart',     \
@@ -167,22 +193,32 @@
 comment, is ignored (i.e., no NEWLINE token is generated), except that
 during interactive input of statements, an entirely blank logical line
 terminates a multi-line statement.
+\index{blank line}
 
 \subsection{Indentation}
 
 Leading whitespace (spaces and tabs) at the beginning of a logical
 line is used to compute the indentation level of the line, which in
 turn is used to determine the grouping of statements.
+\index{indentation}
+\index{whitespace}
+\index{leading whitespace}
+\index{space}
+\index{tab}
+\index{grouping}
+\index{statement grouping}
 
 First, tabs are replaced (from left to right) by one to eight spaces
 such that the total number of characters up to there is a multiple of
-eight (this is intended to be the same rule as used by UNIX).  The
+eight (this is intended to be the same rule as used by {\UNIX}).  The
 total number of spaces preceding the first non-blank character then
 determines the line's indentation.  Indentation cannot be split over
 multiple physical lines using backslashes.
 
 The indentation levels of consecutive lines are used to generate
 INDENT and DEDENT tokens, using a stack, as follows.
+\index{INDENT token}
+\index{DEDENT token}
 
 Before the first line of the file is read, a single zero is pushed on
 the stack; this will never be popped off again.  The numbers pushed on
@@ -223,11 +259,11 @@
             p = perm(l[:i] + l[i+1:])   # error: unexpected indent
             for x in p:
                     r.append(l[i:i+1] + x)
-                return r                # error: inconsistent indent
+                return r                # error: inconsistent dedent
 \end{verbatim}
 
 (Actually, the first three errors are detected by the parser; only the
-last error is found by the lexical analyzer -- the indentation of
+last error is found by the lexical analyzer --- the indentation of
 \verb\return r\ does not match a level popped off the stack.)
 
 \section{Other tokens}
@@ -240,7 +276,10 @@
 
 \section{Identifiers}
 
-Identifiers are described by the following regular expressions:
+Identifiers (also referred to as names) are described by the following
+lexical definitions:
+\index{identifier}
+\index{name}
 
 \begin{verbatim}
 identifier:     (letter|"_") (letter|digit|"_")*
@@ -257,6 +296,8 @@
 The following identifiers are used as reserved words, or {\em
 keywords} of the language, and cannot be used as ordinary
 identifiers.  They must be spelled exactly as written here:
+\index{keyword}
+\index{reserved word}
 
 \begin{verbatim}
 and        del        for        in         print
@@ -282,9 +323,14 @@
 
 \section{Literals}
 
+Literals are notations for constant values of some built-in types.
+\index{literal}
+\index{constant}
+
 \subsection{String literals}
 
-String literals are described by the following regular expressions:
+String literals are described by the following lexical definitions:
+\index{string literal}
 
 \begin{verbatim}
 stringliteral:  "'" stringitem* "'"
@@ -292,11 +338,16 @@
 stringchar:     <any ASCII character except newline or "\" or "'">
 escapeseq:      "'" <any ASCII character except newline>
 \end{verbatim}
+\index{ASCII}
 
 String literals cannot span physical line boundaries.  Escape
 sequences in strings are actually interpreted according to rules
 simular to those used by Standard C.  The recognized escape sequences
 are:
+\index{physical line}
+\index{escape sequence}
+\index{Standard C}
+\index{C}
 
 \begin{center}
 \begin{tabular}{|l|l|}
@@ -312,10 +363,11 @@
 \verb/\t/	& ASCII Horizontal Tab (TAB) \\
 \verb/\v/	& ASCII Vertical Tab (VT) \\
 \verb/\/{\em ooo}	& ASCII character with octal value {\em ooo} \\
-\verb/\x/{em xx...}	& ASCII character with hex value {\em xx...} \\
+\verb/\x/{\em xx...}	& ASCII character with hex value {\em xx...} \\
 \hline
 \end{tabular}
 \end{center}
+\index{ASCII}
 
 In strict compatibility with in Standard C, up to three octal digits are
 accepted, but an unlimited number of hex digits is taken to be part of
@@ -323,19 +375,29 @@
 are used in all current implementations...).
 
 All unrecognized escape sequences are left in the string unchanged,
-i.e., {\em the backslash is left in the string.}  (This rule is
+i.e., {\em the backslash is left in the string.}  (This behavior is
 useful when debugging: if an escape sequence is mistyped, the
 resulting output is more easily recognized as broken.  It also helps a
 great deal for string literals used as regular expressions or
-otherwise passed to other modules that do their own escape handling --
-but you may end up quadrupling backslashes that must appear literally.)
+otherwise passed to other modules that do their own escape handling.)
+\index{unrecognized escape sequence}
 
 \subsection{Numeric literals}
 
 There are three types of numeric literals: plain integers, long
 integers, and floating point numbers.
+\index{number}
+\index{numeric literal}
+\index{integer literal}
+\index{plain integer literal}
+\index{long integer literal}
+\index{floating point literal}
+\index{hexadecimal literal}
+\index{octal literal}
+\index{decimal literal}
 
-Integers and long integers are described by the following regular expressions:
+Integer and long integer literals are described by the following
+lexical definitions:
 
 \begin{verbatim}
 longinteger:    integer ("l"|"L")
@@ -349,23 +411,26 @@
 hexdigit:        digit|"a"..."f"|"A"..."F"
 \end{verbatim}
 
-Although both lower case `l'and upper case `L' are allowed as suffix
+Although both lower case `l' and upper case `L' are allowed as suffix
 for long integers, it is strongly recommended to always use `L', since
 the letter `l' looks too much like the digit `1'.
 
 Plain integer decimal literals must be at most $2^{31} - 1$ (i.e., the
-largest positive integer, assuming 32-bit arithmetic); octal and
-hexadecimal literals may be as large as $2^{32} - 1$.  There is no limit
+largest positive integer, assuming 32-bit arithmetic); plain octal and
+hexadecimal literals may be as large as $2^{32} - 1$, but values
+larger than $2^{31} - 1$ are converted to a signed value in the range
+$-2^{31} \dots 2^{31} - 1$ by subtracting $2^{32}$.  There is no limit
 for long integer literals.
 
 Some examples of plain and long integer literals:
 
 \begin{verbatim}
 7     2147483647                        0177    0x80000000
-3L    79228162514264337593543950336L    0377L   0100000000L
+3L    79228162514264337593543950336L    0377L   0x100000000L
 \end{verbatim}
 
-Floating point numbers are described by the following regular expressions:
+Floating point literals are described by the following lexical
+definitions:
 
 \begin{verbatim}
 floatnumber:    pointfloat | exponentfloat
@@ -392,6 +457,7 @@
 \section{Operators}
 
 The following tokens are operators:
+\index{operators}
 
 \begin{verbatim}
 +       -       *       /       %
@@ -406,15 +472,17 @@
 
 The following tokens serve as delimiters or otherwise have a special
 meaning:
+\index{delimiters}
 
 \begin{verbatim}
 (       )       [       ]       {       }
 ;       ,       :       .       `       =
 \end{verbatim}
 
-The following printing ASCII characters are not used in Python (except
-in string literals and in comments).  Their occurrence is an
-unconditional error:
+The following printing ASCII characters are not used in Python.  Their
+occurrence outside string literals and comments is an unconditional
+error:
+\index{ASCII}
 
 \begin{verbatim}
 !       @       $       "       ?
@@ -422,30 +490,44 @@
 
 They may be used by future versions of the language though!
 
-\chapter{Execution model}
+\chapter{Data model}
 
 \section{Objects, values and types}
 
-I won't try to define rigorously here what an object is, but I'll give
-some properties of objects that are important to know about.
+{\em Objects} are Python's abstraction for data.  All data in a Python
+program is represented by objects or by relations between objects.
+(In a sense, and in conformance to Von Neumann's model of a
+``stored program computer'', code is also represented by objects.)
+\index{object}
+\index{data}
 
 Every object has an identity, a type and a value.  An object's {\em
-identity} never changes once it has been created; think of it as the
-object's address in memory.  An object's {\em type} determines the
-operations that an object supports (e.g., ``does it have a length?'')
-and also defines the ``meaning'' of the object's value.  The type also
-never changes.  The {\em value} of some objects can change; whether
-this is possible is a property of its type.
+identity} never changes once it has been created; you may think of it
+as the object's address in memory.  An object's {\em type} is also
+unchangeable.  It determines the operations that an object supports
+(e.g., ``does it have a length?'') and also defines the possible
+values for objects of that type.  The {\em value} of some objects can
+change.  Objects whose value can change are said to be {\em mutable};
+objects whose value is unchangeable once they are created are called
+{\em immutable}.  The type determines an object's (im)mutability.
+\index{identity of an object}
+\index{value of an object}
+\index{type of an object}
+\index{mutable object}
+\index{immutable object}
 
 Objects are never explicitly destroyed; however, when they become
 unreachable they may be garbage-collected.  An implementation is
-allowed to delay garbage collection or omit it altogether -- it is a
+allowed to delay garbage collection or omit it altogether --- it is a
 matter of implementation quality how garbage collection is
 implemented, as long as no objects are collected that are still
 reachable.  (Implementation note: the current implementation uses a
 reference-counting scheme which collects most objects as soon as they
 become unreachable, but never collects garbage containing circular
 references.)
+\index{garbage collection}
+\index{reference counting}
+\index{unreachable object}
 
 Note that the use of the implementation's tracing or debugging
 facilities may keep objects alive that would normally be collectable.
@@ -458,13 +540,18 @@
 Programs are strongly recommended to always explicitly close such
 objects.
 
-Some objects contain references to other objects.  These references
-are part of the object's value; in most cases, when such a
-``container'' object is compared to another (of the same type), the
-comparison applies to the {\em values} of the referenced objects (not
-their identities).
+Some objects contain references to other objects; these are called
+{\em containers}.  Examples of containers are tuples, lists and
+dictionaries.  The references are part of a container's value.  In
+most cases, when we talk about the value of a container, we imply the
+values, not the identities of the contained objects; however, when we
+talk about the (im)mutability of a container, only the identities of
+the immediately contained objects are implied.  (So, if an immutable
+container contains a reference to a mutable object, its value changes
+if that mutable object is changed.)
+\index{container}
 
-Types affect almost all aspects of an object's life.  Even the meaning
+Types affect almost all aspects of objects' lives.  Even the meaning
 of object identity is affected in some sense: for immutable types,
 operations that compute new values may actually return a reference to
 any existing object with the same type and value, while for mutable
@@ -479,41 +566,506 @@
 are guaranteed to refer to two different, unique, newly created empty
 lists.
 
+\section{The standard type hierarchy}
+
+Below is a list of the types that are built into Python.  Extension
+modules written in C can define additional types.  Future versions of
+Python may add types to the type hierarchy (e.g., rational or complex
+numbers, efficientlt stored arrays of integers, etc.).
+\index{type}
+\index{type hierarchy}
+\index{extension module}
+\index{C}
+
+Some of the type descriptions below contain a paragraph listing
+`special attributes'.  These are attributes that provide access to the
+implementation and are not intended for general use.  Their definition
+may change in the future.  There are also some `generic' special
+attributes, not listed with the individual objects: \verb\__methods__\
+is a list of the method names of a built-in object, if it has any;
+\verb\__members__\ is a list of the data attribute names of a built-in
+object, if it has any.
+\index{attribute}
+\index{special attribute}
+\index{generic special attribute}
+\ttindex{__methods__}
+\ttindex{__members__}
+
+\begin{description}
+
+\item[None]
+This type has a single value.  There is a single object with this value.
+This object is accessed through the built-in name \verb\None\.
+It is returned from functions that don't explicitly return an object.
+\ttindex{None}
+
+\item[Numbers]
+These are created by numeric literals and returned as results
+by arithmetic operators and arithmetic built-in functions.
+Numeric objects are immutable; once created their value never changes.
+Python numbers are of course strongly related to mathematical numbers,
+but subject to the limitations of numerical representation in computers.
+\index{number}
+
+Python distinguishes between integers and floating point numbers:
+
+\begin{description}
+\item[Integers]
+These represent elements from the mathematical set of whole numbers.
+\index{integer}
+
+There are two types of integers:
+
+\begin{description}
+
+\item[Plain integers]
+These represent numbers in the range $-2^{31}$ through $2^{31}-1$.
+(The range may be larger on machines with a larger natural word
+size, but not smaller.)
+When the result of an operation falls outside this range, the
+exception \verb\OverflowError\ is raised.
+For the purpose of shift and mask operations, integers are assumed to
+have a binary, 2's complement notation using 32 or more bits, and
+hiding no bits from the user (i.e., all $2^{32}$ different bit
+patterns correspond to different values).
+\index{plain integer}
+
+\item[Long integers]
+These represent numbers in an unlimited range, subject to avaiable
+(virtual) memory only.  For the purpose of shift and mask operations,
+a binary representation is assumed, and negative numbers are
+represented in a variant of 2's complement which gives the illusion of
+an infinite string of sign bits extending to the left.
+\index{long integer}
+
+\end{description} % Integers
+
+The rules for integer representation are intended to give the most
+meaningful interpretation of shift and mask operations involving
+negative integers and the least surprises when switching between the
+plain and long integer domains.  For any operation except left shift,
+if it yields a result in the plain integer domain without causing
+overflow, it will yield the same result in the long integer domain or
+when using mixed operands.
+\index{integer representation}
+
+\item[Floating point numbers]
+These represent machine-level double precision floating point numbers.  
+You are at the mercy of the underlying machine architecture and
+C implementation for the accepted range and handling of overflow.
+\index{floating point number}
+\index{C}
+
+\end{description} % Numbers
+
+\item[Sequences]
+These represent finite ordered sets indexed by natural numbers.
+The built-in function \verb\len()\ returns the number of elements
+of a sequence.  When this number is $n$, the index set contains
+the numbers $0, 1, \ldots, n-1$.  Element \verb\i\ of sequence
+\verb\a\ is selected by \verb\a[i]\.
+\index{seqence}
+\bifuncindex{len}
+\index{index operation}
+\index{item selection}
+\index{subscription}
+
+Sequences also support slicing: \verb\a[i:j]\ selects all elements
+with index $k$ such that $i < k < j$.  When used as an expression,
+a slice is a sequence of the same type --- this implies that the
+index set is renumbered so that it starts at 0 again.
+\index{slicing}
+
+Sequences are distinguished according to their mutability:
+
+\begin{description}
+%
+\item[Immutable sequences]
+An object of an immutable sequence type cannot change once it is
+created.  (If the object contains references to other objects,
+these other objects may be mutable and may be changed; however
+the collection of objects directly referenced by an immutable object
+cannot change.)
+\index{immutable sequence}
+
+The following types are immutable sequences:
+
+\begin{description}
+
+\item[Strings]
+The elements of a string are characters.  There is no separate
+character type; a character is represented by a string of one element.
+Characters represent (at least) 8-bit bytes.  The built-in
+functions \verb\chr()\ and \verb\ord()\ convert between characters
+and nonnegative integers representing the byte values.
+Bytes with the values 0-127 represent the corresponding ASCII values.
+The string data type is also used to represent arrays of bytes, e.g.,
+to hold data read from a file.
+\index{string}
+\index{character}
+\index{byte}
+\index{ASCII}
+\bifuncindex{chr}
+\bifuncindex{ord}
+
+(On systems whose native character set is not ASCII, strings may use
+EBCDIC in their internal representation, provided the functions
+\verb\chr()\ and \verb\ord()\ implement a mapping between ASCII and
+EBCDIC, and string comparison preserves the ASCII order.
+Or perhaps someone can propose a better rule?)
+\index{ASCII}
+\index{EBCDIC}
+\index{character set}
+\index{string comparison}
+\bifuncindex{chr}
+\bifuncindex{ord}
+
+\item[Tuples]
+The elements of a tuple are arbitrary Python objects.
+Tuples of two or more elements are formed by comma-separated lists
+of expressions.  A tuple of one element (a `singleton') can be formed
+by affixing a comma to an expression (an expression by itself does
+not create a tuple, since parentheses must be usable for grouping of
+expressions).  An empty tuple can be formed by enclosing `nothing' in
+parentheses.
+\index{tuple}
+\index{singleton tuple}
+\index{empty tuple}
+
+\end{description} % Immutable sequences
+
+\item[Mutable sequences]
+Mutable sequences can be changed after they are created.  The
+subscription and slicing notations can be used as the target of
+assignment and \verb\del\ (delete) statements.
+\index{mutable sequece}
+\index{assignment statement}
+\kwindex{del}
+\index{subscription}
+\index{slicing}
+
+There is currently a single mutable sequence type:
+
+\begin{description}
+
+\item[Lists]
+The elements of a list are arbitrary Python objects.  Lists are formed
+by placing a comma-separated list of expressions in square brackets.
+(Note that there are no special cases needed to form lists of length 0
+or 1.)
+\index{list}
+
+\end{description} % Mutable sequences
+
+\end{description} % Sequences
+
+\item[Mapping types]
+These represent finite sets of objects indexed by arbitrary index sets.
+The subscript notation \verb\a[k]\ selects the element indexed
+by \verb\k\ from the mapping \verb\a\; this can be used in
+expressions and as the target of assignments or \verb\del\ statements.
+The built-in function \verb\len()\ returns the number of elements
+in a mapping.
+\bifuncindex{len}
+\index{subscription}
+\index{mapping}
+
+There is currently a single mapping type:
+
+\begin{description}
+
+\item[Dictionaries]
+These represent finite sets of objects indexed by strings.
+Dictionaries are created by the \verb\{...}\ notation (see section
+\ref{dict}).  (Implementation note: the strings used for indexing must
+not contain null bytes.)
+\index{dictionary}
+
+\end{description} % Mapping types
+
+\item[Callable types]
+These are the types to which the function call (invocation) operation,
+written as \verb\function(argument, argument, ...)\, can be applied:
+\index{callable type}
+\indexii{function}{call}
+\index{invocation}
+
+\begin{description}
+
+\item[User-defined functions]
+A user-defined function object is created by a function definition
+(see section \ref{function}).  It should be called with an argument
+list containing the same number of items as the function's formal
+parameter list.
+\indexii{user-defined}{function}
+\index{function object}
+
+Special read-only attributes: \verb\func_code\ is the code object
+representing the compiled function body, and \verb\func_globals\ is (a
+reference to) the dictionary that holds the function's global
+variables --- it implements the global name space of the module in
+which the function was defined.
+\ttindex{func_code}
+\ttindex{func_globals}
+\indexii{global}{name space}
+
+\item[User-defined methods]
+A user-defined method (a.k.a. {\tt object closure}) is a pair of a
+class instance object and a user-defined function.  It should be
+called with an argument list containing one item less than the number
+of items in the function's formal parameter list.  When called, the
+class instance becomes the first argument, and the call arguments are
+shifted one to the right.
+\indexii{object}{closure}
+indexii{user-defined}{method}
+
+Special read-only attributes: \verb\im_self\ is the class instance
+object, \verb\im_func\ is the function object.
+\ttindex{im_func}
+\ttindex{im_self}
+
+\item[Built-in functions]
+A built-in function object is a wrapper around a C function.  Examples
+of built-in functions are \verb\len\ and \verb\math.sin\.  There
+are no special attributes.  The number and type of the arguments are
+determined by the C function.
+\index{C}
+
+\item[Built-in methods]
+This is really a different disguise of a built-in function, this time
+containing an object passed to the C function as an implicit extra
+argument.  An example of a built-in method is \verb\list.append\ if
+\verb\list\ is a list object.
+\indexii{built-in}{method}
+
+\item[Classes]
+Class objects are described below.  When a class object is called as a
+parameterless function, a new class instance (also described below) is
+created and returned.  The class's initialization function is not
+called --- this is the responsibility of the caller.  It is illegal to
+call a class object with one or more arguments.
+\index{class}
+
+\end{description}
+
+\item[Modules]
+Modules are imported by the \verb\import\ statement (see section
+\ref{import}).  A module object is a container for a module's name
+space, which is a dictionary (the same dictionary as referenced by the
+\verb\func_globals\ attribute of functions defined in the module).
+Module attribute references are translated to lookups in this
+dictionary.  A module object does not contain the code object used to
+initialize the module (since it isn't needed once the initialization
+is done).
+\stindex{import}
+\index{module}
+
+Attribute assignment update the module's name space dictionary.
+
+Special read-only attributes: \verb\__dict__\ yields the module's name
+space as a dictionary object; \verb\__name__\ yields the module's name
+as a string object.
+\ttindex{__dict__}
+\ttindex{__name__}
+
+\item[Classes]
+Class objects are created by class definitions (see section
+\ref{class}).  A class is a container for a dictionary containing the
+class's name space.  Class attribute references are translated to
+lookups in this dictionary.  When an attribute name is not found
+there, the attribute search continues in the base classes.  The search
+is depth-first, left-to-right in the order of their occurrence in the
+base class list.
+\index{class}
+\index{container}
+\index{dictionary}
+\indexii{class}{attribute}
+
+Class attribute assignments update the class's dictionary, never the
+dictionary of a base class.
+\indexiii{class}{attribute}{assignment}
+
+A class can be called as a parameterless function to yield a class
+instance (see above).
+
+Special read-only attributes: \verb\__dict__\ yields te dictionary
+containing the class's name space; \verb\__bases__\ yields a tuple
+(possibly empty or a singleton) containing the base classes, in the
+order of their occurrence in the base class list.
+\ttindex{__dict__}
+\ttindex{__bases__}
+
+\item[Class instances]
+A class instance is created by calling a class object as a
+parameterless function.  A class instance has a dictionary in which
+attribute references are searched.  When an attribute is not found
+there, and the instance's class has an attribute by that name, and
+that class attribute is a user-defined function (and in no other
+cases), the instance attribute reference yields a user-defined method
+object (see above) constructed from the instance and the function.
+\indexii{class}{instance}
+\indexii{class instance}{attribute}
+
+Attribute assignments update the instance's dictionary.
+\indexiii{class instance}{attribute}{assignment}
+
+Special read-only attributes: \verb\__dict__\ yields the attribute
+dictionary; \verb\__class__\ yields the instance's class.
+\ttindex{__dict__}
+\ttindex{__class__}
+
+\item[Files]
+A file object represents an open file.  (It is a wrapper around a C
+{\tt stdio} file pointer.)  File objects are created by the
+\verb\open()\ built-in function, and also by \verb\posix.popen()\ and
+the \verb\makefile\ method of socket objects.  \verb\sys.stdin\,
+\verb\sys.stdout\ and \verb\sys.stderr\ are file objects corresponding
+the the interpreter's standard input, output and error streams.
+See the Python Library Reference for methods of file objects and other
+details.
+\index{file}
+\index{C}
+\index{stdio}
+\bifuncindex{open}
+\bifuncindex{popen}
+\bifuncindex{makefile}
+\ttindex{stdin}
+\ttindex{stdout}
+\ttindex{stderr}
+
+\item[Internal types]
+A few types used internally by the interpreter are exposed to the user.
+Their definition may change with future versions of the interpreter,
+but they are mentioned here for completeness.
+\index{internal type}
+
+\begin{description}
+
+\item[Code objects]
+Code objects represent executable code.  The difference between a code
+object and a function object is that the function object contains an
+explicit reference to the function's context (the module in which it
+was defined) which a code object contains no context.  There is no way
+to execute a bare code object.
+\index{code object}
+
+Special read-only attributes: \verb\co_code\ is a string representing
+the sequence of instructions; \verb\co_consts\ is a list of literals
+used by the code; \verb\co_names\ is a list of names (strings) used by
+the code; \verb\co_filename\ is the filename from which the code was
+compiled.  (To find out the line numbers, you would have to decode the
+instructions; the standard library module \verb\dis\ contains an
+example of how to do this.)
+\ttindex{co_code}
+\ttindex{co_consts}
+\ttindex{co_names}
+\ttindex{co_filename}
+
+\item[Frame objects]
+Frame objects represent execution frames.  They may occur in traceback
+objects (see below).
+\index{frame object}
+
+Special read-only attributes: \verb\f_back\ is to the previous
+stack frame (towards the caller), or \verb\None\ if this is the bottom
+stack frame; \verb\f_code\ is the code object being executed in this
+frame; \verb\f_globals\ is the dictionary used to look up global
+variables; \verb\f_locals\ is used for local variables;
+\verb\f_lineno\ gives the line number and \verb\f_lasti\ gives the
+precise instruction (this is an index into the instruction string of
+the code object).
+\ttindex{f_back}
+\ttindex{f_code}
+\ttindex{f_globals}
+\ttindex{f_locals}
+\ttindex{f_lineno}
+\ttindex{f_lasti}
+
+\item[Traceback objects]
+Traceback objects represent a stack trace of an exception.  A
+traceback object is created when an exception occurs.  When the search
+for an exception handler unwinds the execution stack, at each unwound
+level a traceback object is inserted in front of the current
+traceback.  When an exception handler is entered, the stack trace is
+made available to the program as \verb\sys.exc_traceback\.  When the
+program contains no suitable handler, the stack trace is written
+(nicely formatted) to the standard error stream; if the interpreter is
+interactive, it is also made available to the user as
+\verb\sys.last_traceback\.
+\index{traceback object}
+\indexii{stack}{trace}
+\index{exception handler}
+\index{execution stack}
+\ttindex{exc_traceback}
+\ttindex{last_traceback}
+
+Special read-only attributes: \verb\tb_next\ is the next level in the
+stack trace (towards the frame where the exception occurred), or
+\verb\None\ if there is no next level; \verb\tb_frame\ points to the
+execution frame of the current level; \verb\tb_lineno\ gives the line
+number where the exception occurred; \verb\tb_lasti\ indicates the
+precise instruction.  The line number and last instruction in the
+traceback may differ from the line number of its frame object if the
+exception occurred in a \verb\try\ statement with no matching
+\verb\except\ clause or with a \verb\finally\ clause.
+\ttindex{tb_next}
+\ttindex{tb_frame}
+\ttindex{tb_lineno}
+\ttindex{tb_lasti}
+\stindex{try}
+
+\end{description} % Internal types
+
+\end{description} % Types
+
+\chapter{Execution model}
+
 \section{Code blocks, execution frames, and name spaces}
 
-A ``code block'' is a piece of Python program text that can be
+A {\em code block} is a piece of Python program text that can be
 executed as a unit, such as a module, a class definition or a function
 body.  Some code blocks (like modules) are executed only once, others
 (like function bodies) may be executed many times.  Code block may
 textually contain other code blocks.  Code blocks may invoke other
-code blocks (that aren't textually contained) as part of their
-execution.
+code blocks (that may or may not be textually contained in them) as
+part of their execution, e.g., by invoking (calling) a function.
+\index{code block}
 
-Each command typed interactively is a separate code block; a script
-file is a code block; the string argument passed to the built-in
-functions \verb\eval\ and \verb\exec\ are code blocks; the expression
-read and evaluated by the built-in function \verb\input\ is a code
-block.
+The following are code blocks:  A module is a code block.  A function
+body is a code block.  A class definition is a code block.  Each
+command typed interactively is a separate code block; a script file is
+a code block.  The string argument passed to the built-in functions
+\verb\eval\ and \verb\exec\ are code blocks.  And finally, the
+expression read and evaluated by the built-in function \verb\input\ is
+a code block.
 
-A code block is executed in an ``execution frame''.  An execution
-frame contains some administrative information (used for debugging),
+A code block is executed in an execution frame.  An {\em execution
+frame} contains some administrative information (used for debugging),
 determines where and how execution continues after the code block's
 execution has completed, and (perhaps most importantly) defines two
-``name spaces'' that affect execution of the code block.
+name spaces, the local and the global name space, that affect
+execution of the code block.
+\index{execution frame}
 
-A name space is a mapping from names (identifiers) to objects.  A
-particular name space may be referenced by more than one execution
+A {\em name space} is a mapping from names (identifiers) to objects.
+A particular name space may be referenced by more than one execution
 frame, and from other places as well.  Adding a name to a name space
-is called ``binding'' a name (to an object); changing the mapping of a
-name is called ``rebinding''; removing a name from the name space is
-called ``unbinding''.  Name spaces are functionally equivalent to
-dictionaries (described below).
+is called {\em binding} a name (to an object); changing the mapping of
+a name is called {\em rebinding}; removing a name is {\em unbinding}.
+Name spaces are functionally equivalent to dictionaries.
+\index{name space}
+\indexii{binding}{name}
+\indexii{rebinding}{name}
+\indexii{unbinding}{name}
 
-The ``local name space'' of an execution frame determines the default
-place where names are defined and searched.  The ``global name
-space'' determines the place where names listed in \verb\global\
+The {\em local name space} of an execution frame determines the default
+place where names are defined and searched.  The {\em global name
+space} determines the place where names listed in \verb\global\
 statements are defined and searched, and where names that are not
 explicitly bound in the current code block are searched.
+\indexii{local}{name space}
+\indexii{global}{name space}
+\stindex{global}
 
 Whether a name is local or global in a code block is determined by
 static inspection of the source text for the code block: in the
@@ -528,7 +1080,7 @@
 (A target occurring in a \verb\del\ statement does not bind a name.)
 
 When a global name is not found in the global name space, it is
-searched in the list of ``built-in'' names (this is actually the
+searched in the list of ``built-in'' names (which is actually the
 global name space of the module \verb\builtin\).  When a name is not
 found at all, the \verb\NameError\ exception is raised.
 
@@ -558,30 +1110,42 @@
 \end{center}
 
 Notes:
+
 \begin{description}
+
+\item[n.s.] means {\em name space}
+
 \item[(1)] The global and local name space for these functions can be
 overridden with optional extra arguments.
+
 \end{description}
 
 \section{Exceptions}
 
 Exceptions are a means of breaking out of the normal flow of control
-of a code block in order to handle errors (or other exceptional
-conditions).  An exception is ``raised'' at the point where the error
-is detected; it may be ``handled'' by the surrounding code block or by any
-code block that directly or indirectly invoked the code block where
-the error occurred.
+of a code block in order to handle errors or other exceptional
+conditions.  An exception is {\em raised} at the point where the error
+is detected; it may be {\em handled} by the surrounding code block or
+by any code block that directly or indirectly invoked the code block
+where the error occurred.
+\index{exception}
+\index{raise an exception}
+\index{handle an exception}
+\index{exception handler}
+\index{errors}
+\index{error handling}
 
 The Python interpreter raises an exception when it detects an run-time
 error (such as division by zero).  A Python program can also
 explicitly raise an exception with the \verb\raise\ statement.
-Exception handlers are specified with the \verb\try...except\ statement.
+Exception handlers are specified with the \verb\try...except\
+statement.
 
-Python uses the ``termination'' model of error handling: a handler can
-find out what happened and continue execution at an outer level, but
-it cannot repair the cause of the error and retry the failing
-operation (except by re-entering the the offending piece of code from
-the top).
+Python uses the ``termination'' model of error handling: an exception
+handler can find out what happened and continue execution at an outer
+level, but it cannot repair the cause of the error and retry the
+failing operation (except by re-entering the the offending piece of
+code from the top).
 
 When an exception is not handled at all, the interpreter terminates
 execution of the program, or returns to its interactive main loop.
@@ -594,345 +1158,14 @@
 selection of an exception handler, but is passed to the selected
 exception handler as additional information.
 
-\chapter{The standard type hierarchy}
-
-Below is a list of the types that are built into Python.  Extension
-modules written in C can define additional types.  Future versions of
-Python may add types to the type hierarchy (e.g., rational or complex
-numbers, lists of efficiently stored integers, etc.).
-
-Some type descriptions contain a paragraph listing `special
-attributes'.  These are attributes that provide access to the
-implementation and are not intended for general use.  Their definition
-may change in the future.  There are also some `generic' special
-attributes, not listed with the individual objects: \verb\__methods__\
-is a list of the method names of a built-in object, if it has any;
-\verb\__members__\ is a list of the data attribute names of a built-in
-object, if it has any.
-
-\begin{description}
-
-\item[None]
-This type has a single value.  There is a single object with this value.
-This object is accessed through the built-in name \verb\None\.
-It is returned from functions that don't explicitly return an object.
-
-\item[Numbers]
-These are created by numeric literals and returned as results
-by arithmetic operators and arithmetic built-in functions.
-Numeric objects are immutable; once created their value never changes.
-Python numbers are of course strongly related to mathematical numbers,
-but subject to the limitations of numerical representation in computers.
-
-Python distinguishes between integers and floating point numbers:
-
-\begin{description}
-\item[Integers]
-These represent elements from the mathematical set of whole numbers.
-
-There are two types of integers:
-
-\begin{description}
-
-\item[Plain integers]
-These represent numbers in the range $-2^{31}$ through $2^{31}-1$.
-(The range may be larger on machines with a larger natural word
-size, but not smaller.)
-When the result of an operation falls outside this range, the
-exception \verb\OverflowError\ is raised.
-For the purpose of shift and mask operations, integers are assumed to
-have a binary, 2's complement notation using 32 or more bits, and
-hiding no bits from the user (i.e., all $2^{32}$ different bit
-patterns correspond to different values).
-
-\item[Long integers]
-These represent numbers in an unlimited range, subject to avaiable
-(virtual) memory only.  For the purpose of shift and mask operations,
-a binary representation is assumed, and negative numbers are
-represented in a variant of 2's complement which gives the illusion of
-an infinite string of sign bits extending to the left.
-
-\end{description} % Integers
-
-The rules for integer representation are intended to give the most
-meaningful interpretation of shift and mask operations involving
-negative integers and the least surprises when switching between the
-plain and long integer domains.  For any operation except left shift,
-if it yields a result in the plain integer domain without causing
-overflow, it will yield the same result in the long integer domain or
-when using mixed operands.
-
-\item[Floating point numbers]
-These represent machine-level double precision floating point numbers.  
-You are at the mercy of the underlying machine architecture and
-C implementation for the accepted range and handling of overflow.
-
-\end{description} % Numbers
-
-\item[Sequences]
-These represent finite ordered sets indexed by natural numbers.
-The built-in function \verb\len()\ returns the number of elements
-of a sequence.  When this number is $n$, the index set contains
-the numbers $0, 1, \ldots, n-1$.  Element \verb\i\ of sequence
-\verb\a\ is selected by \verb\a[i]\.
-
-Sequences also support slicing: \verb\a[i:j]\ selects all elements
-with index $k$ such that $i < k < j$.  When used as an expression,
-a slice is a sequence of the same type -- this implies that the
-index set is renumbered so that it starts at 0 again.
-
-Sequences are distinguished according to their mutability:
-
-\begin{description}
-%
-\item[Immutable sequences]
-An object of an immutable sequence type cannot change once it is
-created.  (If the object contains references to other objects,
-these other objects may be mutable and may be changed; however
-the collection of objects directly referenced by an immutable object
-cannot change.)
-
-The following types are immutable sequences:
-
-\begin{description}
-
-\item[Strings]
-The elements of a string are characters.  There is no separate
-character type; a character is represented by a string of one element.
-Characters represent (at least) 8-bit bytes.  The built-in
-functions \verb\chr()\ and \verb\ord()\ convert between characters
-and nonnegative integers representing the byte values.
-Bytes with the values 0-127 represent the corresponding ASCII values.
-
-(On systems whose native character set is not ASCII, strings may use
-EBCDIC in their internal representation, provided the functions
-\verb\chr()\ and \verb\ord()\ implement a mapping between ASCII and
-EBCDIC, and string comparisons preserve the ASCII order.
-Or perhaps someone can propose a better rule?)
-
-\item[Tuples]
-The elements of a tuple are arbitrary Python objects.
-Tuples of two or more elements are formed by comma-separated lists
-of expressions.  A tuple of one element can be formed by affixing
-a comma to an expression (an expression by itself of course does
-not create a tuple).  An empty tuple can be formed by enclosing
-`nothing' in parentheses.
-
-\end{description} % Immutable sequences
-
-\item[Mutable sequences]
-Mutable sequences can be changed after they are created.
-The subscript and slice notations can be used as the target
-of assignment and \verb\del\ (delete) statements.
-
-There is currently a single mutable sequence type:
-
-\begin{description}
-
-\item[Lists]
-The elements of a list are arbitrary Python objects.
-Lists are formed by placing a comma-separated list of expressions
-in square brackets.  (Note that there are no special cases for lists
-of length 0 or 1.)
-
-\end{description} % Mutable sequences
-
-\end{description} % Sequences
-
-\item[Mapping types]
-These represent finite sets of objects indexed by arbitrary index sets.
-The subscript notation \verb\a[k]\ selects the element indexed
-by \verb\k\ from the mapping \verb\a\; this can be used in
-expressions and as the target of assignments or \verb\del\ statements.
-The built-in function \verb\len()\ returns the number of elements
-in a mapping.
-
-There is currently a single mapping type:
-
-\begin{description}
-
-\item[Dictionaries]
-These represent finite sets of objects indexed by strings.
-Dictionaries are created by the \verb\{...}\ notation (see section
-\ref{dict}).  (Implementation note: the strings used for indexing must
-not contain null bytes.)
-
-\end{description} % Mapping types
-
-\item[Callable types]
-These are the types to which the function call operation (written as
-\verb\function(argument, argument, ...)\) can be applied:
-
-\begin{description}
-
-\item[User-defined functions]
-A user-defined function is created by a function definition (see
-section \ref{function}).  It should be called with an argument list
-containing the same number of items as the function's formal parameter
-list.
-
-Special read-only attributes: \verb\func_code\ is the code object
-representing the compiled function body, and \verb\func_globals\ is (a
-reference to) the dictionary that holds the function's global
-variables -- it implements the global name space of the module in
-which the function was defined.
-
-\item[User-defined methods]
-A user-defined method (a.k.a. {\tt object closure}) is a pair of a
-class instance object and a user-defined function.  It should be
-called with an argument list containing one item less than the number
-of items in the function's formal parameter list.  When called, the
-class instance becomes the first argument, and the call arguments are
-shifted one to the right.
-
-Special read-only attributes: \verb\im_self\ is the class instance
-object, \verb\im_func\ is the function object.
-
-\item[Built-in functions]
-A built-in function object is a wrapper around a C function.  Examples
-of built-in functions are \verb\len\ and \verb\math.sin\.  There
-are no special attributes.  The number and type of the arguments are
-determined by the C function.
-
-\item[Built-in methods]
-This is really a different disguise of a built-in function, this time
-containing an object passed to the C function as an implicit extra
-argument.  An example of a built-in method is \verb\list.append\ if
-\verb\list\ is a list object.
-
-\item[Classes]
-Class objects are described below.  When a class object is called as a
-parameterless function, a new class instance (also described below) is
-created and returned.  The class's initialization function is not
-called -- this is the responsibility of the caller.  It is illegal to
-call a class object with one or more arguments.
-
-\end{description}
-
-\item[Modules]
-Modules are imported by the \verb\import\ statement (see section
-\ref{import}).  A module object is a container for a module's name
-space, which is a dictionary (the same dictionary as referenced by the
-\verb\func_globals\ attribute of functions defined in the module).
-Module attribute references are translated to lookups in this
-dictionary.  A module object does not contain the code object used to
-initialize the module (since it isn't needed once the initialization
-is done).
-
-Attribute assignment update the module's name space dictionary.
-
-Special read-only attributes: \verb\__dict__\ yields the module's name
-space as a dictionary object; \verb\__name__\ yields the module's name.
-
-\item[Classes]
-Class objects are created by class definitions (see section
-\ref{class}).  A class is a container for a dictionary containing the
-class's name space.  Class attribute references are translated to
-lookups in this dictionary.  When an attribute name is not found
-there, the attribute search continues in the base classes.  The search
-is depth-first, left-to-right in the order of their occurrence in the
-base class list.
-
-Attribute assignments update the class's dictionary, never the
-dictionary of a base class.
-
-A class can be called as a parameterless function to yield a class
-instance (see above).
-
-Special read-only attributes: \verb\__dict__\ yields te dictionary
-containing the class's name space; \verb\__bases__\ yields a tuple
-(possibly empty or a singleton) containing the base classes, in the
-order of their occurrence in the base class list.
-
-\item[Class instances]
-A class instance is created by calling a class object as a
-parameterless function.  A class instance has a dictionary in which
-attribute references are searched.  When an attribute is not found
-there, and the instance's class has an attribute by that name, and
-that class attribute is a user-defined function (and in no other
-cases), the instance attribute reference yields a user-defined method
-object (see above) constructed from the instance and the function.
-
-Attribute assignments update the instance's dictionary.
-
-Special read-only attributes: \verb\__dict__\ yields the attribute
-dictionary; \verb\__class__\ yields the instance's class.
-
-\item[Files]
-A file object represents an open file.  (It is a wrapper around a C
-{\tt stdio} file pointer.)  File objects are created by the
-\verb\open()\ built-in function, and also by \verb\posix.popen()\ and
-the \verb\makefile\ method of socket objects.  \verb\sys.stdin\,
-\verb\sys.stdout\ and \verb\sys.stderr\ are file objects corresponding
-the the interpreter's standard input, output and error streams.
-See the Python Library Reference for methods of file objects and other
-details.
-
-\item[Internal types]
-A few types used internally by the interpreter are exposed to the user.
-Their definition may change with future versions of the interpreter,
-but they are mentioned here for completeness.
-
-\begin{description}
-
-\item[Code objects]
-Code objects represent executable code.  The difference between a code
-object and a function object is that the function object contains an
-explicit reference to the function's context (the module in which it
-was defined) which a code object contains no context.  There is no way
-to execute a bare code object.
-
-Special read-only attributes: \verb\co_code\ is a string representing
-the sequence of instructions; \verb\co_consts\ is a list of literals
-used by the code; \verb\co_names\ is a list of names (strings) used by
-the code; \verb\co_filename\ is the filename from which the code was
-compiled.  (To find out the line numbers, you would have to decode the
-instructions; the standard library module \verb\dis\ contains an
-example of how to do this.)
-
-\item[Frame objects]
-Frame objects represent execution frames.  They may occur in traceback
-objects (see below).
-
-Special read-only attributes: \verb\f_back\ is to the previous
-stack frame (towards the caller), or \verb\None\ if this is the bottom
-stack frame; \verb\f_code\ is the code object being executed in this
-frame; \verb\f_globals\ is the dictionary used to look up global
-variables; \verb\f_locals\ is used for local variables;
-\verb\f_lineno\ gives the line number and \verb\f_lasti\ gives the
-precise instruction (this is an index into the instruction string of
-the code object).
-
-\item[Traceback objects]
-Traceback objects represent a stack trace of an exception.  A
-traceback object is created when an exception occurs.  When the search
-for an exception handler unwinds the execution stack, at each unwound
-level a traceback object is inserted in front of the current
-traceback.  When an exception handler is entered, the stack trace is
-made available to the program as \verb\sys.exc_traceback\.  When the
-program contains no suitable handler, the stack trace is written
-(nicely formatted) to the standard error stream; if the interpreter is
-interactive, it is made available to the user as
-\verb\sys.last_traceback\.
-
-Special read-only attributes: \verb\tb_next\ is the next level in the
-stack trace (towards the frame where the exception occurred), or
-\verb\None\ if there is no next level; \verb\tb_frame\ points to the
-execution frame of the current level; \verb\tb_lineno\ gives the line
-number where the exception occurred; \verb\tb_lasti\ indicates the
-precise instruction.  The line number and last instruction in the
-traceback may differ from the line number of its frame object if the
-exception occurred in a \verb\try\ statement with no matching
-\verb\except\ clause or with a \verb\finally\ clause.
-
-\end{description} % Internal types
-
-\end{description} % Types
+See also the description of the \verb\try\ and \verb\raise\
+statements.
 
 \chapter{Expressions and conditions}
 
-From now on, extended BNF notation will be used to describe syntax,
-not lexical analysis.
+In this and the following chapters, extended BNF notation will be used
+to describe syntax, not lexical analysis.
+\index{BNF}
 
 This chapter explains the meaning of the elements of expressions and
 conditions.  Conditions are a superset of expressions, and a condition
@@ -942,7 +1175,7 @@
 right-hand side of assignments; this catches some nasty bugs like
 accedentally writing \verb\x == 1\ instead of \verb\x = 1\.
 
-The comma has several roles in Python's syntax.  It is usually an
+The comma plays several roles in Python's syntax.  It is usually an
 operator with a lower precedence than all others, but occasionally
 serves other purposes as well; e.g., it separates function arguments,
 is used in list and dictionary constructors, and has special semantics
@@ -1037,7 +1270,7 @@
 
 (Note that tuples are not formed by the parentheses, but rather by use
 of the comma operator.  The exception is the empty tuple, for which
-parentheses {\em are} required -- allowing unparenthesized ``nothing''
+parentheses {\em are} required --- allowing unparenthesized ``nothing''
 in expressions would causes ambiguities and allow common typos to
 pass uncaught.)
 
@@ -1632,7 +1865,7 @@
 pass_stmt:      "pass"
 \end{verbatim}
 
-\verb\pass\ is a null operation -- when it is executed, nothing
+\verb\pass\ is a null operation --- when it is executed, nothing
 happens.  It is useful as a placeholder when a statement is
 required syntactically, but no code needs to be executed, for example:
 
@@ -2035,12 +2268,12 @@
 \verb\try\ suite of a \verb\try...finally\ statement, the
 \verb\finally\ clause is also executed `on the way out'.  A
 \verb\continue\ statement is illegal in the \verb\try\ clause (the
-reason is a problem with the current implementation -- this
+reason is a problem with the current implementation --- this
 restriction may be lifted in the future).
 
 \section{Function definitions} \label{function}
 
-XXX
+A function definition defines a function:
 
 \begin{verbatim}
 funcdef:        "def" identifier "(" [parameter_list] ")" ":" suite
@@ -2048,18 +2281,35 @@
 parameter:      identifier | "(" parameter_list ")"
 \end{verbatim}
 
-XXX
+A function definition is an executable statement.  Its execution binds
+the function name in the current local name space to a function object
+(a wrapper around the executable code for the function).  This
+function object contains a reference to the current global name space
+as the global name space to be used when the function is called.
+
+The function definition does not execute the function body; this gets
+executed only when the function is called.  Function call semantics
+are described elsewhere (see XXX).
 
 \section{Class definitions} \label{class}
 
-XXX
+A class definition defines a class:
 
 \begin{verbatim}
 classdef:       "class" identifier [inheritance] ":" suite
 inheritance:    "(" condition_list ")"
 \end{verbatim}
 
-XXX
+A class definition is an executable statement.  It first executes the
+inheritance list, if present.  The class's suite is executed in a new
+execution frame, using a newly created local name space and the
+original global name space.  (Usually, the suite contains only
+function definitions.)  When the class's suite finishes execution, its
+execution frame is discarded but its local name space is saved.  A
+class object (see XXX) is created using the inheritance list for the
+base classes and the saved local name space for the attribute
+dictionary.  The class name is then bound to this class object in the
+original local name space.
 
 \section{P.M.}
 
@@ -2067,4 +2317,6 @@
 XXX Syntax for interactive input, eval, exec, execfile, input
 XXX New definition of expressions (as conditions)
 
+\input{ref.ind}		% The index
+
 \end{document}
diff --git a/Doc/ref/ref.tex b/Doc/ref/ref.tex
index 823df62..7a9fd5c 100644
--- a/Doc/ref/ref.tex
+++ b/Doc/ref/ref.tex
@@ -9,6 +9,9 @@
 	E-mail: {\tt guido@cwi.nl}
 }
 
+% Tell \index to actually write the .idx file
+\makeindex
+
 \begin{document}
 
 \pagenumbering{roman}
@@ -65,17 +68,19 @@
 to the average reader, but will leave room for ambiguities.
 Consequently, if you were coming from Mars and tried to re-implement
 Python from this document alone, you might have to guess things and in
-fact you would be implementing quite a different language.
+fact you would probably end up implementing quite a different language.
 On the other hand, if you are using
 Python and wonder what the precise rules about a particular area of
-the language are, you should definitely be able to find it here.
+the language are, you should definitely be able to find them here.
 
 It is dangerous to add too many implementation details to a language
-reference document -- the implementation may change, and other
+reference document --- the implementation may change, and other
 implementations of the same language may work differently.  On the
 other hand, there is currently only one Python implementation, and
 its particular quirks are sometimes worth being mentioned, especially
-where the implementation imposes additional limitations.
+where the implementation imposes additional limitations.  Therefore,
+you'll find short ``implementation notes'' sprinkled throughout the
+text.
 
 Every Python implementation comes with a number of built-in and
 standard modules.  These are not documented here, but in the separate
@@ -87,6 +92,10 @@
 
 The descriptions of lexical analysis and syntax use a modified BNF
 grammar notation.  This uses the following style of definition:
+\index{BNF}
+\index{grammar}
+\index{syntax}
+\index{notation}
 
 \begin{verbatim}
 name:           lc_letter (lc_letter | "_")*
@@ -96,7 +105,7 @@
 The first line says that a \verb\name\ is an \verb\lc_letter\ followed by
 a sequence of zero or more \verb\lc_letter\s and underscores.  An
 \verb\lc_letter\ in turn is any of the single characters `a' through `z'.
-(This rule is actually adhered to for the names defined in syntax and
+(This rule is actually adhered to for the names defined in lexical and
 grammar rules in this document.)
 
 Each rule begins with a name (which is the name defined by the rule)
@@ -119,18 +128,25 @@
 characters.  A phrase between angular brackets (\verb\<...>\) gives an
 informal description of the symbol defined; e.g., this could be used
 to describe the notion of `control character' if needed.
+\index{lexical definitions}
+\index{ASCII}
 
 Even though the notation used is almost the same, there is a big
 difference between the meaning of lexical and syntactic definitions:
 a lexical definition operates on the individual characters of the
 input source, while a syntax definition operates on the stream of
-tokens generated by the lexical analysis.
+tokens generated by the lexical analysis.  All uses of BNF in the next
+chapter (``Lexical Analysis'') are lexical definitions; uses in
+subsequenc chapter are syntactic definitions.
 
 \chapter{Lexical analysis}
 
 A Python program is read by a {\em parser}.  Input to the parser is a
 stream of {\em tokens}, generated by the {\em lexical analyzer}.  This
 chapter describes how the lexical analyzer breaks a file into tokens.
+\index{lexical analysis}
+\index{parser}
+\index{token}
 
 \section{Line structure}
 
@@ -138,6 +154,9 @@
 a logical line is represented by the token NEWLINE.  Statements cannot
 cross logical line boundaries except where NEWLINE is allowed by the
 syntax (e.g., between statements in compound statements).
+\index{line structure}
+\index{logical line}
+\index{NEWLINE token}
 
 \subsection{Comments}
 
@@ -145,6 +164,10 @@
 a string literal, and ends at the end of the physical line.  A comment
 always signifies the end of the logical line.  Comments are ignored by
 the syntax.
+\index{comment}
+\index{logical line}
+\index{physical line}
+\index{hash character}
 
 \subsection{Line joining}
 
@@ -153,6 +176,9 @@
 in a backslash that is not part of a string literal or comment, it is
 joined with the following forming a single logical line, deleting the
 backslash and the following end-of-line character.  For example:
+\index{physical line}
+\index{line joining}
+\index{backslash character}
 %
 \begin{verbatim}
 moth_names = ['Januari', 'Februari', 'Maart',     \
@@ -167,22 +193,32 @@
 comment, is ignored (i.e., no NEWLINE token is generated), except that
 during interactive input of statements, an entirely blank logical line
 terminates a multi-line statement.
+\index{blank line}
 
 \subsection{Indentation}
 
 Leading whitespace (spaces and tabs) at the beginning of a logical
 line is used to compute the indentation level of the line, which in
 turn is used to determine the grouping of statements.
+\index{indentation}
+\index{whitespace}
+\index{leading whitespace}
+\index{space}
+\index{tab}
+\index{grouping}
+\index{statement grouping}
 
 First, tabs are replaced (from left to right) by one to eight spaces
 such that the total number of characters up to there is a multiple of
-eight (this is intended to be the same rule as used by UNIX).  The
+eight (this is intended to be the same rule as used by {\UNIX}).  The
 total number of spaces preceding the first non-blank character then
 determines the line's indentation.  Indentation cannot be split over
 multiple physical lines using backslashes.
 
 The indentation levels of consecutive lines are used to generate
 INDENT and DEDENT tokens, using a stack, as follows.
+\index{INDENT token}
+\index{DEDENT token}
 
 Before the first line of the file is read, a single zero is pushed on
 the stack; this will never be popped off again.  The numbers pushed on
@@ -223,11 +259,11 @@
             p = perm(l[:i] + l[i+1:])   # error: unexpected indent
             for x in p:
                     r.append(l[i:i+1] + x)
-                return r                # error: inconsistent indent
+                return r                # error: inconsistent dedent
 \end{verbatim}
 
 (Actually, the first three errors are detected by the parser; only the
-last error is found by the lexical analyzer -- the indentation of
+last error is found by the lexical analyzer --- the indentation of
 \verb\return r\ does not match a level popped off the stack.)
 
 \section{Other tokens}
@@ -240,7 +276,10 @@
 
 \section{Identifiers}
 
-Identifiers are described by the following regular expressions:
+Identifiers (also referred to as names) are described by the following
+lexical definitions:
+\index{identifier}
+\index{name}
 
 \begin{verbatim}
 identifier:     (letter|"_") (letter|digit|"_")*
@@ -257,6 +296,8 @@
 The following identifiers are used as reserved words, or {\em
 keywords} of the language, and cannot be used as ordinary
 identifiers.  They must be spelled exactly as written here:
+\index{keyword}
+\index{reserved word}
 
 \begin{verbatim}
 and        del        for        in         print
@@ -282,9 +323,14 @@
 
 \section{Literals}
 
+Literals are notations for constant values of some built-in types.
+\index{literal}
+\index{constant}
+
 \subsection{String literals}
 
-String literals are described by the following regular expressions:
+String literals are described by the following lexical definitions:
+\index{string literal}
 
 \begin{verbatim}
 stringliteral:  "'" stringitem* "'"
@@ -292,11 +338,16 @@
 stringchar:     <any ASCII character except newline or "\" or "'">
 escapeseq:      "'" <any ASCII character except newline>
 \end{verbatim}
+\index{ASCII}
 
 String literals cannot span physical line boundaries.  Escape
 sequences in strings are actually interpreted according to rules
 simular to those used by Standard C.  The recognized escape sequences
 are:
+\index{physical line}
+\index{escape sequence}
+\index{Standard C}
+\index{C}
 
 \begin{center}
 \begin{tabular}{|l|l|}
@@ -312,10 +363,11 @@
 \verb/\t/	& ASCII Horizontal Tab (TAB) \\
 \verb/\v/	& ASCII Vertical Tab (VT) \\
 \verb/\/{\em ooo}	& ASCII character with octal value {\em ooo} \\
-\verb/\x/{em xx...}	& ASCII character with hex value {\em xx...} \\
+\verb/\x/{\em xx...}	& ASCII character with hex value {\em xx...} \\
 \hline
 \end{tabular}
 \end{center}
+\index{ASCII}
 
 In strict compatibility with in Standard C, up to three octal digits are
 accepted, but an unlimited number of hex digits is taken to be part of
@@ -323,19 +375,29 @@
 are used in all current implementations...).
 
 All unrecognized escape sequences are left in the string unchanged,
-i.e., {\em the backslash is left in the string.}  (This rule is
+i.e., {\em the backslash is left in the string.}  (This behavior is
 useful when debugging: if an escape sequence is mistyped, the
 resulting output is more easily recognized as broken.  It also helps a
 great deal for string literals used as regular expressions or
-otherwise passed to other modules that do their own escape handling --
-but you may end up quadrupling backslashes that must appear literally.)
+otherwise passed to other modules that do their own escape handling.)
+\index{unrecognized escape sequence}
 
 \subsection{Numeric literals}
 
 There are three types of numeric literals: plain integers, long
 integers, and floating point numbers.
+\index{number}
+\index{numeric literal}
+\index{integer literal}
+\index{plain integer literal}
+\index{long integer literal}
+\index{floating point literal}
+\index{hexadecimal literal}
+\index{octal literal}
+\index{decimal literal}
 
-Integers and long integers are described by the following regular expressions:
+Integer and long integer literals are described by the following
+lexical definitions:
 
 \begin{verbatim}
 longinteger:    integer ("l"|"L")
@@ -349,23 +411,26 @@
 hexdigit:        digit|"a"..."f"|"A"..."F"
 \end{verbatim}
 
-Although both lower case `l'and upper case `L' are allowed as suffix
+Although both lower case `l' and upper case `L' are allowed as suffix
 for long integers, it is strongly recommended to always use `L', since
 the letter `l' looks too much like the digit `1'.
 
 Plain integer decimal literals must be at most $2^{31} - 1$ (i.e., the
-largest positive integer, assuming 32-bit arithmetic); octal and
-hexadecimal literals may be as large as $2^{32} - 1$.  There is no limit
+largest positive integer, assuming 32-bit arithmetic); plain octal and
+hexadecimal literals may be as large as $2^{32} - 1$, but values
+larger than $2^{31} - 1$ are converted to a signed value in the range
+$-2^{31} \dots 2^{31} - 1$ by subtracting $2^{32}$.  There is no limit
 for long integer literals.
 
 Some examples of plain and long integer literals:
 
 \begin{verbatim}
 7     2147483647                        0177    0x80000000
-3L    79228162514264337593543950336L    0377L   0100000000L
+3L    79228162514264337593543950336L    0377L   0x100000000L
 \end{verbatim}
 
-Floating point numbers are described by the following regular expressions:
+Floating point literals are described by the following lexical
+definitions:
 
 \begin{verbatim}
 floatnumber:    pointfloat | exponentfloat
@@ -392,6 +457,7 @@
 \section{Operators}
 
 The following tokens are operators:
+\index{operators}
 
 \begin{verbatim}
 +       -       *       /       %
@@ -406,15 +472,17 @@
 
 The following tokens serve as delimiters or otherwise have a special
 meaning:
+\index{delimiters}
 
 \begin{verbatim}
 (       )       [       ]       {       }
 ;       ,       :       .       `       =
 \end{verbatim}
 
-The following printing ASCII characters are not used in Python (except
-in string literals and in comments).  Their occurrence is an
-unconditional error:
+The following printing ASCII characters are not used in Python.  Their
+occurrence outside string literals and comments is an unconditional
+error:
+\index{ASCII}
 
 \begin{verbatim}
 !       @       $       "       ?
@@ -422,30 +490,44 @@
 
 They may be used by future versions of the language though!
 
-\chapter{Execution model}
+\chapter{Data model}
 
 \section{Objects, values and types}
 
-I won't try to define rigorously here what an object is, but I'll give
-some properties of objects that are important to know about.
+{\em Objects} are Python's abstraction for data.  All data in a Python
+program is represented by objects or by relations between objects.
+(In a sense, and in conformance to Von Neumann's model of a
+``stored program computer'', code is also represented by objects.)
+\index{object}
+\index{data}
 
 Every object has an identity, a type and a value.  An object's {\em
-identity} never changes once it has been created; think of it as the
-object's address in memory.  An object's {\em type} determines the
-operations that an object supports (e.g., ``does it have a length?'')
-and also defines the ``meaning'' of the object's value.  The type also
-never changes.  The {\em value} of some objects can change; whether
-this is possible is a property of its type.
+identity} never changes once it has been created; you may think of it
+as the object's address in memory.  An object's {\em type} is also
+unchangeable.  It determines the operations that an object supports
+(e.g., ``does it have a length?'') and also defines the possible
+values for objects of that type.  The {\em value} of some objects can
+change.  Objects whose value can change are said to be {\em mutable};
+objects whose value is unchangeable once they are created are called
+{\em immutable}.  The type determines an object's (im)mutability.
+\index{identity of an object}
+\index{value of an object}
+\index{type of an object}
+\index{mutable object}
+\index{immutable object}
 
 Objects are never explicitly destroyed; however, when they become
 unreachable they may be garbage-collected.  An implementation is
-allowed to delay garbage collection or omit it altogether -- it is a
+allowed to delay garbage collection or omit it altogether --- it is a
 matter of implementation quality how garbage collection is
 implemented, as long as no objects are collected that are still
 reachable.  (Implementation note: the current implementation uses a
 reference-counting scheme which collects most objects as soon as they
 become unreachable, but never collects garbage containing circular
 references.)
+\index{garbage collection}
+\index{reference counting}
+\index{unreachable object}
 
 Note that the use of the implementation's tracing or debugging
 facilities may keep objects alive that would normally be collectable.
@@ -458,13 +540,18 @@
 Programs are strongly recommended to always explicitly close such
 objects.
 
-Some objects contain references to other objects.  These references
-are part of the object's value; in most cases, when such a
-``container'' object is compared to another (of the same type), the
-comparison applies to the {\em values} of the referenced objects (not
-their identities).
+Some objects contain references to other objects; these are called
+{\em containers}.  Examples of containers are tuples, lists and
+dictionaries.  The references are part of a container's value.  In
+most cases, when we talk about the value of a container, we imply the
+values, not the identities of the contained objects; however, when we
+talk about the (im)mutability of a container, only the identities of
+the immediately contained objects are implied.  (So, if an immutable
+container contains a reference to a mutable object, its value changes
+if that mutable object is changed.)
+\index{container}
 
-Types affect almost all aspects of an object's life.  Even the meaning
+Types affect almost all aspects of objects' lives.  Even the meaning
 of object identity is affected in some sense: for immutable types,
 operations that compute new values may actually return a reference to
 any existing object with the same type and value, while for mutable
@@ -479,41 +566,506 @@
 are guaranteed to refer to two different, unique, newly created empty
 lists.
 
+\section{The standard type hierarchy}
+
+Below is a list of the types that are built into Python.  Extension
+modules written in C can define additional types.  Future versions of
+Python may add types to the type hierarchy (e.g., rational or complex
+numbers, efficientlt stored arrays of integers, etc.).
+\index{type}
+\index{type hierarchy}
+\index{extension module}
+\index{C}
+
+Some of the type descriptions below contain a paragraph listing
+`special attributes'.  These are attributes that provide access to the
+implementation and are not intended for general use.  Their definition
+may change in the future.  There are also some `generic' special
+attributes, not listed with the individual objects: \verb\__methods__\
+is a list of the method names of a built-in object, if it has any;
+\verb\__members__\ is a list of the data attribute names of a built-in
+object, if it has any.
+\index{attribute}
+\index{special attribute}
+\index{generic special attribute}
+\ttindex{__methods__}
+\ttindex{__members__}
+
+\begin{description}
+
+\item[None]
+This type has a single value.  There is a single object with this value.
+This object is accessed through the built-in name \verb\None\.
+It is returned from functions that don't explicitly return an object.
+\ttindex{None}
+
+\item[Numbers]
+These are created by numeric literals and returned as results
+by arithmetic operators and arithmetic built-in functions.
+Numeric objects are immutable; once created their value never changes.
+Python numbers are of course strongly related to mathematical numbers,
+but subject to the limitations of numerical representation in computers.
+\index{number}
+
+Python distinguishes between integers and floating point numbers:
+
+\begin{description}
+\item[Integers]
+These represent elements from the mathematical set of whole numbers.
+\index{integer}
+
+There are two types of integers:
+
+\begin{description}
+
+\item[Plain integers]
+These represent numbers in the range $-2^{31}$ through $2^{31}-1$.
+(The range may be larger on machines with a larger natural word
+size, but not smaller.)
+When the result of an operation falls outside this range, the
+exception \verb\OverflowError\ is raised.
+For the purpose of shift and mask operations, integers are assumed to
+have a binary, 2's complement notation using 32 or more bits, and
+hiding no bits from the user (i.e., all $2^{32}$ different bit
+patterns correspond to different values).
+\index{plain integer}
+
+\item[Long integers]
+These represent numbers in an unlimited range, subject to avaiable
+(virtual) memory only.  For the purpose of shift and mask operations,
+a binary representation is assumed, and negative numbers are
+represented in a variant of 2's complement which gives the illusion of
+an infinite string of sign bits extending to the left.
+\index{long integer}
+
+\end{description} % Integers
+
+The rules for integer representation are intended to give the most
+meaningful interpretation of shift and mask operations involving
+negative integers and the least surprises when switching between the
+plain and long integer domains.  For any operation except left shift,
+if it yields a result in the plain integer domain without causing
+overflow, it will yield the same result in the long integer domain or
+when using mixed operands.
+\index{integer representation}
+
+\item[Floating point numbers]
+These represent machine-level double precision floating point numbers.  
+You are at the mercy of the underlying machine architecture and
+C implementation for the accepted range and handling of overflow.
+\index{floating point number}
+\index{C}
+
+\end{description} % Numbers
+
+\item[Sequences]
+These represent finite ordered sets indexed by natural numbers.
+The built-in function \verb\len()\ returns the number of elements
+of a sequence.  When this number is $n$, the index set contains
+the numbers $0, 1, \ldots, n-1$.  Element \verb\i\ of sequence
+\verb\a\ is selected by \verb\a[i]\.
+\index{seqence}
+\bifuncindex{len}
+\index{index operation}
+\index{item selection}
+\index{subscription}
+
+Sequences also support slicing: \verb\a[i:j]\ selects all elements
+with index $k$ such that $i < k < j$.  When used as an expression,
+a slice is a sequence of the same type --- this implies that the
+index set is renumbered so that it starts at 0 again.
+\index{slicing}
+
+Sequences are distinguished according to their mutability:
+
+\begin{description}
+%
+\item[Immutable sequences]
+An object of an immutable sequence type cannot change once it is
+created.  (If the object contains references to other objects,
+these other objects may be mutable and may be changed; however
+the collection of objects directly referenced by an immutable object
+cannot change.)
+\index{immutable sequence}
+
+The following types are immutable sequences:
+
+\begin{description}
+
+\item[Strings]
+The elements of a string are characters.  There is no separate
+character type; a character is represented by a string of one element.
+Characters represent (at least) 8-bit bytes.  The built-in
+functions \verb\chr()\ and \verb\ord()\ convert between characters
+and nonnegative integers representing the byte values.
+Bytes with the values 0-127 represent the corresponding ASCII values.
+The string data type is also used to represent arrays of bytes, e.g.,
+to hold data read from a file.
+\index{string}
+\index{character}
+\index{byte}
+\index{ASCII}
+\bifuncindex{chr}
+\bifuncindex{ord}
+
+(On systems whose native character set is not ASCII, strings may use
+EBCDIC in their internal representation, provided the functions
+\verb\chr()\ and \verb\ord()\ implement a mapping between ASCII and
+EBCDIC, and string comparison preserves the ASCII order.
+Or perhaps someone can propose a better rule?)
+\index{ASCII}
+\index{EBCDIC}
+\index{character set}
+\index{string comparison}
+\bifuncindex{chr}
+\bifuncindex{ord}
+
+\item[Tuples]
+The elements of a tuple are arbitrary Python objects.
+Tuples of two or more elements are formed by comma-separated lists
+of expressions.  A tuple of one element (a `singleton') can be formed
+by affixing a comma to an expression (an expression by itself does
+not create a tuple, since parentheses must be usable for grouping of
+expressions).  An empty tuple can be formed by enclosing `nothing' in
+parentheses.
+\index{tuple}
+\index{singleton tuple}
+\index{empty tuple}
+
+\end{description} % Immutable sequences
+
+\item[Mutable sequences]
+Mutable sequences can be changed after they are created.  The
+subscription and slicing notations can be used as the target of
+assignment and \verb\del\ (delete) statements.
+\index{mutable sequece}
+\index{assignment statement}
+\kwindex{del}
+\index{subscription}
+\index{slicing}
+
+There is currently a single mutable sequence type:
+
+\begin{description}
+
+\item[Lists]
+The elements of a list are arbitrary Python objects.  Lists are formed
+by placing a comma-separated list of expressions in square brackets.
+(Note that there are no special cases needed to form lists of length 0
+or 1.)
+\index{list}
+
+\end{description} % Mutable sequences
+
+\end{description} % Sequences
+
+\item[Mapping types]
+These represent finite sets of objects indexed by arbitrary index sets.
+The subscript notation \verb\a[k]\ selects the element indexed
+by \verb\k\ from the mapping \verb\a\; this can be used in
+expressions and as the target of assignments or \verb\del\ statements.
+The built-in function \verb\len()\ returns the number of elements
+in a mapping.
+\bifuncindex{len}
+\index{subscription}
+\index{mapping}
+
+There is currently a single mapping type:
+
+\begin{description}
+
+\item[Dictionaries]
+These represent finite sets of objects indexed by strings.
+Dictionaries are created by the \verb\{...}\ notation (see section
+\ref{dict}).  (Implementation note: the strings used for indexing must
+not contain null bytes.)
+\index{dictionary}
+
+\end{description} % Mapping types
+
+\item[Callable types]
+These are the types to which the function call (invocation) operation,
+written as \verb\function(argument, argument, ...)\, can be applied:
+\index{callable type}
+\indexii{function}{call}
+\index{invocation}
+
+\begin{description}
+
+\item[User-defined functions]
+A user-defined function object is created by a function definition
+(see section \ref{function}).  It should be called with an argument
+list containing the same number of items as the function's formal
+parameter list.
+\indexii{user-defined}{function}
+\index{function object}
+
+Special read-only attributes: \verb\func_code\ is the code object
+representing the compiled function body, and \verb\func_globals\ is (a
+reference to) the dictionary that holds the function's global
+variables --- it implements the global name space of the module in
+which the function was defined.
+\ttindex{func_code}
+\ttindex{func_globals}
+\indexii{global}{name space}
+
+\item[User-defined methods]
+A user-defined method (a.k.a. {\tt object closure}) is a pair of a
+class instance object and a user-defined function.  It should be
+called with an argument list containing one item less than the number
+of items in the function's formal parameter list.  When called, the
+class instance becomes the first argument, and the call arguments are
+shifted one to the right.
+\indexii{object}{closure}
+indexii{user-defined}{method}
+
+Special read-only attributes: \verb\im_self\ is the class instance
+object, \verb\im_func\ is the function object.
+\ttindex{im_func}
+\ttindex{im_self}
+
+\item[Built-in functions]
+A built-in function object is a wrapper around a C function.  Examples
+of built-in functions are \verb\len\ and \verb\math.sin\.  There
+are no special attributes.  The number and type of the arguments are
+determined by the C function.
+\index{C}
+
+\item[Built-in methods]
+This is really a different disguise of a built-in function, this time
+containing an object passed to the C function as an implicit extra
+argument.  An example of a built-in method is \verb\list.append\ if
+\verb\list\ is a list object.
+\indexii{built-in}{method}
+
+\item[Classes]
+Class objects are described below.  When a class object is called as a
+parameterless function, a new class instance (also described below) is
+created and returned.  The class's initialization function is not
+called --- this is the responsibility of the caller.  It is illegal to
+call a class object with one or more arguments.
+\index{class}
+
+\end{description}
+
+\item[Modules]
+Modules are imported by the \verb\import\ statement (see section
+\ref{import}).  A module object is a container for a module's name
+space, which is a dictionary (the same dictionary as referenced by the
+\verb\func_globals\ attribute of functions defined in the module).
+Module attribute references are translated to lookups in this
+dictionary.  A module object does not contain the code object used to
+initialize the module (since it isn't needed once the initialization
+is done).
+\stindex{import}
+\index{module}
+
+Attribute assignment update the module's name space dictionary.
+
+Special read-only attributes: \verb\__dict__\ yields the module's name
+space as a dictionary object; \verb\__name__\ yields the module's name
+as a string object.
+\ttindex{__dict__}
+\ttindex{__name__}
+
+\item[Classes]
+Class objects are created by class definitions (see section
+\ref{class}).  A class is a container for a dictionary containing the
+class's name space.  Class attribute references are translated to
+lookups in this dictionary.  When an attribute name is not found
+there, the attribute search continues in the base classes.  The search
+is depth-first, left-to-right in the order of their occurrence in the
+base class list.
+\index{class}
+\index{container}
+\index{dictionary}
+\indexii{class}{attribute}
+
+Class attribute assignments update the class's dictionary, never the
+dictionary of a base class.
+\indexiii{class}{attribute}{assignment}
+
+A class can be called as a parameterless function to yield a class
+instance (see above).
+
+Special read-only attributes: \verb\__dict__\ yields te dictionary
+containing the class's name space; \verb\__bases__\ yields a tuple
+(possibly empty or a singleton) containing the base classes, in the
+order of their occurrence in the base class list.
+\ttindex{__dict__}
+\ttindex{__bases__}
+
+\item[Class instances]
+A class instance is created by calling a class object as a
+parameterless function.  A class instance has a dictionary in which
+attribute references are searched.  When an attribute is not found
+there, and the instance's class has an attribute by that name, and
+that class attribute is a user-defined function (and in no other
+cases), the instance attribute reference yields a user-defined method
+object (see above) constructed from the instance and the function.
+\indexii{class}{instance}
+\indexii{class instance}{attribute}
+
+Attribute assignments update the instance's dictionary.
+\indexiii{class instance}{attribute}{assignment}
+
+Special read-only attributes: \verb\__dict__\ yields the attribute
+dictionary; \verb\__class__\ yields the instance's class.
+\ttindex{__dict__}
+\ttindex{__class__}
+
+\item[Files]
+A file object represents an open file.  (It is a wrapper around a C
+{\tt stdio} file pointer.)  File objects are created by the
+\verb\open()\ built-in function, and also by \verb\posix.popen()\ and
+the \verb\makefile\ method of socket objects.  \verb\sys.stdin\,
+\verb\sys.stdout\ and \verb\sys.stderr\ are file objects corresponding
+the the interpreter's standard input, output and error streams.
+See the Python Library Reference for methods of file objects and other
+details.
+\index{file}
+\index{C}
+\index{stdio}
+\bifuncindex{open}
+\bifuncindex{popen}
+\bifuncindex{makefile}
+\ttindex{stdin}
+\ttindex{stdout}
+\ttindex{stderr}
+
+\item[Internal types]
+A few types used internally by the interpreter are exposed to the user.
+Their definition may change with future versions of the interpreter,
+but they are mentioned here for completeness.
+\index{internal type}
+
+\begin{description}
+
+\item[Code objects]
+Code objects represent executable code.  The difference between a code
+object and a function object is that the function object contains an
+explicit reference to the function's context (the module in which it
+was defined) which a code object contains no context.  There is no way
+to execute a bare code object.
+\index{code object}
+
+Special read-only attributes: \verb\co_code\ is a string representing
+the sequence of instructions; \verb\co_consts\ is a list of literals
+used by the code; \verb\co_names\ is a list of names (strings) used by
+the code; \verb\co_filename\ is the filename from which the code was
+compiled.  (To find out the line numbers, you would have to decode the
+instructions; the standard library module \verb\dis\ contains an
+example of how to do this.)
+\ttindex{co_code}
+\ttindex{co_consts}
+\ttindex{co_names}
+\ttindex{co_filename}
+
+\item[Frame objects]
+Frame objects represent execution frames.  They may occur in traceback
+objects (see below).
+\index{frame object}
+
+Special read-only attributes: \verb\f_back\ is to the previous
+stack frame (towards the caller), or \verb\None\ if this is the bottom
+stack frame; \verb\f_code\ is the code object being executed in this
+frame; \verb\f_globals\ is the dictionary used to look up global
+variables; \verb\f_locals\ is used for local variables;
+\verb\f_lineno\ gives the line number and \verb\f_lasti\ gives the
+precise instruction (this is an index into the instruction string of
+the code object).
+\ttindex{f_back}
+\ttindex{f_code}
+\ttindex{f_globals}
+\ttindex{f_locals}
+\ttindex{f_lineno}
+\ttindex{f_lasti}
+
+\item[Traceback objects]
+Traceback objects represent a stack trace of an exception.  A
+traceback object is created when an exception occurs.  When the search
+for an exception handler unwinds the execution stack, at each unwound
+level a traceback object is inserted in front of the current
+traceback.  When an exception handler is entered, the stack trace is
+made available to the program as \verb\sys.exc_traceback\.  When the
+program contains no suitable handler, the stack trace is written
+(nicely formatted) to the standard error stream; if the interpreter is
+interactive, it is also made available to the user as
+\verb\sys.last_traceback\.
+\index{traceback object}
+\indexii{stack}{trace}
+\index{exception handler}
+\index{execution stack}
+\ttindex{exc_traceback}
+\ttindex{last_traceback}
+
+Special read-only attributes: \verb\tb_next\ is the next level in the
+stack trace (towards the frame where the exception occurred), or
+\verb\None\ if there is no next level; \verb\tb_frame\ points to the
+execution frame of the current level; \verb\tb_lineno\ gives the line
+number where the exception occurred; \verb\tb_lasti\ indicates the
+precise instruction.  The line number and last instruction in the
+traceback may differ from the line number of its frame object if the
+exception occurred in a \verb\try\ statement with no matching
+\verb\except\ clause or with a \verb\finally\ clause.
+\ttindex{tb_next}
+\ttindex{tb_frame}
+\ttindex{tb_lineno}
+\ttindex{tb_lasti}
+\stindex{try}
+
+\end{description} % Internal types
+
+\end{description} % Types
+
+\chapter{Execution model}
+
 \section{Code blocks, execution frames, and name spaces}
 
-A ``code block'' is a piece of Python program text that can be
+A {\em code block} is a piece of Python program text that can be
 executed as a unit, such as a module, a class definition or a function
 body.  Some code blocks (like modules) are executed only once, others
 (like function bodies) may be executed many times.  Code block may
 textually contain other code blocks.  Code blocks may invoke other
-code blocks (that aren't textually contained) as part of their
-execution.
+code blocks (that may or may not be textually contained in them) as
+part of their execution, e.g., by invoking (calling) a function.
+\index{code block}
 
-Each command typed interactively is a separate code block; a script
-file is a code block; the string argument passed to the built-in
-functions \verb\eval\ and \verb\exec\ are code blocks; the expression
-read and evaluated by the built-in function \verb\input\ is a code
-block.
+The following are code blocks:  A module is a code block.  A function
+body is a code block.  A class definition is a code block.  Each
+command typed interactively is a separate code block; a script file is
+a code block.  The string argument passed to the built-in functions
+\verb\eval\ and \verb\exec\ are code blocks.  And finally, the
+expression read and evaluated by the built-in function \verb\input\ is
+a code block.
 
-A code block is executed in an ``execution frame''.  An execution
-frame contains some administrative information (used for debugging),
+A code block is executed in an execution frame.  An {\em execution
+frame} contains some administrative information (used for debugging),
 determines where and how execution continues after the code block's
 execution has completed, and (perhaps most importantly) defines two
-``name spaces'' that affect execution of the code block.
+name spaces, the local and the global name space, that affect
+execution of the code block.
+\index{execution frame}
 
-A name space is a mapping from names (identifiers) to objects.  A
-particular name space may be referenced by more than one execution
+A {\em name space} is a mapping from names (identifiers) to objects.
+A particular name space may be referenced by more than one execution
 frame, and from other places as well.  Adding a name to a name space
-is called ``binding'' a name (to an object); changing the mapping of a
-name is called ``rebinding''; removing a name from the name space is
-called ``unbinding''.  Name spaces are functionally equivalent to
-dictionaries (described below).
+is called {\em binding} a name (to an object); changing the mapping of
+a name is called {\em rebinding}; removing a name is {\em unbinding}.
+Name spaces are functionally equivalent to dictionaries.
+\index{name space}
+\indexii{binding}{name}
+\indexii{rebinding}{name}
+\indexii{unbinding}{name}
 
-The ``local name space'' of an execution frame determines the default
-place where names are defined and searched.  The ``global name
-space'' determines the place where names listed in \verb\global\
+The {\em local name space} of an execution frame determines the default
+place where names are defined and searched.  The {\em global name
+space} determines the place where names listed in \verb\global\
 statements are defined and searched, and where names that are not
 explicitly bound in the current code block are searched.
+\indexii{local}{name space}
+\indexii{global}{name space}
+\stindex{global}
 
 Whether a name is local or global in a code block is determined by
 static inspection of the source text for the code block: in the
@@ -528,7 +1080,7 @@
 (A target occurring in a \verb\del\ statement does not bind a name.)
 
 When a global name is not found in the global name space, it is
-searched in the list of ``built-in'' names (this is actually the
+searched in the list of ``built-in'' names (which is actually the
 global name space of the module \verb\builtin\).  When a name is not
 found at all, the \verb\NameError\ exception is raised.
 
@@ -558,30 +1110,42 @@
 \end{center}
 
 Notes:
+
 \begin{description}
+
+\item[n.s.] means {\em name space}
+
 \item[(1)] The global and local name space for these functions can be
 overridden with optional extra arguments.
+
 \end{description}
 
 \section{Exceptions}
 
 Exceptions are a means of breaking out of the normal flow of control
-of a code block in order to handle errors (or other exceptional
-conditions).  An exception is ``raised'' at the point where the error
-is detected; it may be ``handled'' by the surrounding code block or by any
-code block that directly or indirectly invoked the code block where
-the error occurred.
+of a code block in order to handle errors or other exceptional
+conditions.  An exception is {\em raised} at the point where the error
+is detected; it may be {\em handled} by the surrounding code block or
+by any code block that directly or indirectly invoked the code block
+where the error occurred.
+\index{exception}
+\index{raise an exception}
+\index{handle an exception}
+\index{exception handler}
+\index{errors}
+\index{error handling}
 
 The Python interpreter raises an exception when it detects an run-time
 error (such as division by zero).  A Python program can also
 explicitly raise an exception with the \verb\raise\ statement.
-Exception handlers are specified with the \verb\try...except\ statement.
+Exception handlers are specified with the \verb\try...except\
+statement.
 
-Python uses the ``termination'' model of error handling: a handler can
-find out what happened and continue execution at an outer level, but
-it cannot repair the cause of the error and retry the failing
-operation (except by re-entering the the offending piece of code from
-the top).
+Python uses the ``termination'' model of error handling: an exception
+handler can find out what happened and continue execution at an outer
+level, but it cannot repair the cause of the error and retry the
+failing operation (except by re-entering the the offending piece of
+code from the top).
 
 When an exception is not handled at all, the interpreter terminates
 execution of the program, or returns to its interactive main loop.
@@ -594,345 +1158,14 @@
 selection of an exception handler, but is passed to the selected
 exception handler as additional information.
 
-\chapter{The standard type hierarchy}
-
-Below is a list of the types that are built into Python.  Extension
-modules written in C can define additional types.  Future versions of
-Python may add types to the type hierarchy (e.g., rational or complex
-numbers, lists of efficiently stored integers, etc.).
-
-Some type descriptions contain a paragraph listing `special
-attributes'.  These are attributes that provide access to the
-implementation and are not intended for general use.  Their definition
-may change in the future.  There are also some `generic' special
-attributes, not listed with the individual objects: \verb\__methods__\
-is a list of the method names of a built-in object, if it has any;
-\verb\__members__\ is a list of the data attribute names of a built-in
-object, if it has any.
-
-\begin{description}
-
-\item[None]
-This type has a single value.  There is a single object with this value.
-This object is accessed through the built-in name \verb\None\.
-It is returned from functions that don't explicitly return an object.
-
-\item[Numbers]
-These are created by numeric literals and returned as results
-by arithmetic operators and arithmetic built-in functions.
-Numeric objects are immutable; once created their value never changes.
-Python numbers are of course strongly related to mathematical numbers,
-but subject to the limitations of numerical representation in computers.
-
-Python distinguishes between integers and floating point numbers:
-
-\begin{description}
-\item[Integers]
-These represent elements from the mathematical set of whole numbers.
-
-There are two types of integers:
-
-\begin{description}
-
-\item[Plain integers]
-These represent numbers in the range $-2^{31}$ through $2^{31}-1$.
-(The range may be larger on machines with a larger natural word
-size, but not smaller.)
-When the result of an operation falls outside this range, the
-exception \verb\OverflowError\ is raised.
-For the purpose of shift and mask operations, integers are assumed to
-have a binary, 2's complement notation using 32 or more bits, and
-hiding no bits from the user (i.e., all $2^{32}$ different bit
-patterns correspond to different values).
-
-\item[Long integers]
-These represent numbers in an unlimited range, subject to avaiable
-(virtual) memory only.  For the purpose of shift and mask operations,
-a binary representation is assumed, and negative numbers are
-represented in a variant of 2's complement which gives the illusion of
-an infinite string of sign bits extending to the left.
-
-\end{description} % Integers
-
-The rules for integer representation are intended to give the most
-meaningful interpretation of shift and mask operations involving
-negative integers and the least surprises when switching between the
-plain and long integer domains.  For any operation except left shift,
-if it yields a result in the plain integer domain without causing
-overflow, it will yield the same result in the long integer domain or
-when using mixed operands.
-
-\item[Floating point numbers]
-These represent machine-level double precision floating point numbers.  
-You are at the mercy of the underlying machine architecture and
-C implementation for the accepted range and handling of overflow.
-
-\end{description} % Numbers
-
-\item[Sequences]
-These represent finite ordered sets indexed by natural numbers.
-The built-in function \verb\len()\ returns the number of elements
-of a sequence.  When this number is $n$, the index set contains
-the numbers $0, 1, \ldots, n-1$.  Element \verb\i\ of sequence
-\verb\a\ is selected by \verb\a[i]\.
-
-Sequences also support slicing: \verb\a[i:j]\ selects all elements
-with index $k$ such that $i < k < j$.  When used as an expression,
-a slice is a sequence of the same type -- this implies that the
-index set is renumbered so that it starts at 0 again.
-
-Sequences are distinguished according to their mutability:
-
-\begin{description}
-%
-\item[Immutable sequences]
-An object of an immutable sequence type cannot change once it is
-created.  (If the object contains references to other objects,
-these other objects may be mutable and may be changed; however
-the collection of objects directly referenced by an immutable object
-cannot change.)
-
-The following types are immutable sequences:
-
-\begin{description}
-
-\item[Strings]
-The elements of a string are characters.  There is no separate
-character type; a character is represented by a string of one element.
-Characters represent (at least) 8-bit bytes.  The built-in
-functions \verb\chr()\ and \verb\ord()\ convert between characters
-and nonnegative integers representing the byte values.
-Bytes with the values 0-127 represent the corresponding ASCII values.
-
-(On systems whose native character set is not ASCII, strings may use
-EBCDIC in their internal representation, provided the functions
-\verb\chr()\ and \verb\ord()\ implement a mapping between ASCII and
-EBCDIC, and string comparisons preserve the ASCII order.
-Or perhaps someone can propose a better rule?)
-
-\item[Tuples]
-The elements of a tuple are arbitrary Python objects.
-Tuples of two or more elements are formed by comma-separated lists
-of expressions.  A tuple of one element can be formed by affixing
-a comma to an expression (an expression by itself of course does
-not create a tuple).  An empty tuple can be formed by enclosing
-`nothing' in parentheses.
-
-\end{description} % Immutable sequences
-
-\item[Mutable sequences]
-Mutable sequences can be changed after they are created.
-The subscript and slice notations can be used as the target
-of assignment and \verb\del\ (delete) statements.
-
-There is currently a single mutable sequence type:
-
-\begin{description}
-
-\item[Lists]
-The elements of a list are arbitrary Python objects.
-Lists are formed by placing a comma-separated list of expressions
-in square brackets.  (Note that there are no special cases for lists
-of length 0 or 1.)
-
-\end{description} % Mutable sequences
-
-\end{description} % Sequences
-
-\item[Mapping types]
-These represent finite sets of objects indexed by arbitrary index sets.
-The subscript notation \verb\a[k]\ selects the element indexed
-by \verb\k\ from the mapping \verb\a\; this can be used in
-expressions and as the target of assignments or \verb\del\ statements.
-The built-in function \verb\len()\ returns the number of elements
-in a mapping.
-
-There is currently a single mapping type:
-
-\begin{description}
-
-\item[Dictionaries]
-These represent finite sets of objects indexed by strings.
-Dictionaries are created by the \verb\{...}\ notation (see section
-\ref{dict}).  (Implementation note: the strings used for indexing must
-not contain null bytes.)
-
-\end{description} % Mapping types
-
-\item[Callable types]
-These are the types to which the function call operation (written as
-\verb\function(argument, argument, ...)\) can be applied:
-
-\begin{description}
-
-\item[User-defined functions]
-A user-defined function is created by a function definition (see
-section \ref{function}).  It should be called with an argument list
-containing the same number of items as the function's formal parameter
-list.
-
-Special read-only attributes: \verb\func_code\ is the code object
-representing the compiled function body, and \verb\func_globals\ is (a
-reference to) the dictionary that holds the function's global
-variables -- it implements the global name space of the module in
-which the function was defined.
-
-\item[User-defined methods]
-A user-defined method (a.k.a. {\tt object closure}) is a pair of a
-class instance object and a user-defined function.  It should be
-called with an argument list containing one item less than the number
-of items in the function's formal parameter list.  When called, the
-class instance becomes the first argument, and the call arguments are
-shifted one to the right.
-
-Special read-only attributes: \verb\im_self\ is the class instance
-object, \verb\im_func\ is the function object.
-
-\item[Built-in functions]
-A built-in function object is a wrapper around a C function.  Examples
-of built-in functions are \verb\len\ and \verb\math.sin\.  There
-are no special attributes.  The number and type of the arguments are
-determined by the C function.
-
-\item[Built-in methods]
-This is really a different disguise of a built-in function, this time
-containing an object passed to the C function as an implicit extra
-argument.  An example of a built-in method is \verb\list.append\ if
-\verb\list\ is a list object.
-
-\item[Classes]
-Class objects are described below.  When a class object is called as a
-parameterless function, a new class instance (also described below) is
-created and returned.  The class's initialization function is not
-called -- this is the responsibility of the caller.  It is illegal to
-call a class object with one or more arguments.
-
-\end{description}
-
-\item[Modules]
-Modules are imported by the \verb\import\ statement (see section
-\ref{import}).  A module object is a container for a module's name
-space, which is a dictionary (the same dictionary as referenced by the
-\verb\func_globals\ attribute of functions defined in the module).
-Module attribute references are translated to lookups in this
-dictionary.  A module object does not contain the code object used to
-initialize the module (since it isn't needed once the initialization
-is done).
-
-Attribute assignment update the module's name space dictionary.
-
-Special read-only attributes: \verb\__dict__\ yields the module's name
-space as a dictionary object; \verb\__name__\ yields the module's name.
-
-\item[Classes]
-Class objects are created by class definitions (see section
-\ref{class}).  A class is a container for a dictionary containing the
-class's name space.  Class attribute references are translated to
-lookups in this dictionary.  When an attribute name is not found
-there, the attribute search continues in the base classes.  The search
-is depth-first, left-to-right in the order of their occurrence in the
-base class list.
-
-Attribute assignments update the class's dictionary, never the
-dictionary of a base class.
-
-A class can be called as a parameterless function to yield a class
-instance (see above).
-
-Special read-only attributes: \verb\__dict__\ yields te dictionary
-containing the class's name space; \verb\__bases__\ yields a tuple
-(possibly empty or a singleton) containing the base classes, in the
-order of their occurrence in the base class list.
-
-\item[Class instances]
-A class instance is created by calling a class object as a
-parameterless function.  A class instance has a dictionary in which
-attribute references are searched.  When an attribute is not found
-there, and the instance's class has an attribute by that name, and
-that class attribute is a user-defined function (and in no other
-cases), the instance attribute reference yields a user-defined method
-object (see above) constructed from the instance and the function.
-
-Attribute assignments update the instance's dictionary.
-
-Special read-only attributes: \verb\__dict__\ yields the attribute
-dictionary; \verb\__class__\ yields the instance's class.
-
-\item[Files]
-A file object represents an open file.  (It is a wrapper around a C
-{\tt stdio} file pointer.)  File objects are created by the
-\verb\open()\ built-in function, and also by \verb\posix.popen()\ and
-the \verb\makefile\ method of socket objects.  \verb\sys.stdin\,
-\verb\sys.stdout\ and \verb\sys.stderr\ are file objects corresponding
-the the interpreter's standard input, output and error streams.
-See the Python Library Reference for methods of file objects and other
-details.
-
-\item[Internal types]
-A few types used internally by the interpreter are exposed to the user.
-Their definition may change with future versions of the interpreter,
-but they are mentioned here for completeness.
-
-\begin{description}
-
-\item[Code objects]
-Code objects represent executable code.  The difference between a code
-object and a function object is that the function object contains an
-explicit reference to the function's context (the module in which it
-was defined) which a code object contains no context.  There is no way
-to execute a bare code object.
-
-Special read-only attributes: \verb\co_code\ is a string representing
-the sequence of instructions; \verb\co_consts\ is a list of literals
-used by the code; \verb\co_names\ is a list of names (strings) used by
-the code; \verb\co_filename\ is the filename from which the code was
-compiled.  (To find out the line numbers, you would have to decode the
-instructions; the standard library module \verb\dis\ contains an
-example of how to do this.)
-
-\item[Frame objects]
-Frame objects represent execution frames.  They may occur in traceback
-objects (see below).
-
-Special read-only attributes: \verb\f_back\ is to the previous
-stack frame (towards the caller), or \verb\None\ if this is the bottom
-stack frame; \verb\f_code\ is the code object being executed in this
-frame; \verb\f_globals\ is the dictionary used to look up global
-variables; \verb\f_locals\ is used for local variables;
-\verb\f_lineno\ gives the line number and \verb\f_lasti\ gives the
-precise instruction (this is an index into the instruction string of
-the code object).
-
-\item[Traceback objects]
-Traceback objects represent a stack trace of an exception.  A
-traceback object is created when an exception occurs.  When the search
-for an exception handler unwinds the execution stack, at each unwound
-level a traceback object is inserted in front of the current
-traceback.  When an exception handler is entered, the stack trace is
-made available to the program as \verb\sys.exc_traceback\.  When the
-program contains no suitable handler, the stack trace is written
-(nicely formatted) to the standard error stream; if the interpreter is
-interactive, it is made available to the user as
-\verb\sys.last_traceback\.
-
-Special read-only attributes: \verb\tb_next\ is the next level in the
-stack trace (towards the frame where the exception occurred), or
-\verb\None\ if there is no next level; \verb\tb_frame\ points to the
-execution frame of the current level; \verb\tb_lineno\ gives the line
-number where the exception occurred; \verb\tb_lasti\ indicates the
-precise instruction.  The line number and last instruction in the
-traceback may differ from the line number of its frame object if the
-exception occurred in a \verb\try\ statement with no matching
-\verb\except\ clause or with a \verb\finally\ clause.
-
-\end{description} % Internal types
-
-\end{description} % Types
+See also the description of the \verb\try\ and \verb\raise\
+statements.
 
 \chapter{Expressions and conditions}
 
-From now on, extended BNF notation will be used to describe syntax,
-not lexical analysis.
+In this and the following chapters, extended BNF notation will be used
+to describe syntax, not lexical analysis.
+\index{BNF}
 
 This chapter explains the meaning of the elements of expressions and
 conditions.  Conditions are a superset of expressions, and a condition
@@ -942,7 +1175,7 @@
 right-hand side of assignments; this catches some nasty bugs like
 accedentally writing \verb\x == 1\ instead of \verb\x = 1\.
 
-The comma has several roles in Python's syntax.  It is usually an
+The comma plays several roles in Python's syntax.  It is usually an
 operator with a lower precedence than all others, but occasionally
 serves other purposes as well; e.g., it separates function arguments,
 is used in list and dictionary constructors, and has special semantics
@@ -1037,7 +1270,7 @@
 
 (Note that tuples are not formed by the parentheses, but rather by use
 of the comma operator.  The exception is the empty tuple, for which
-parentheses {\em are} required -- allowing unparenthesized ``nothing''
+parentheses {\em are} required --- allowing unparenthesized ``nothing''
 in expressions would causes ambiguities and allow common typos to
 pass uncaught.)
 
@@ -1632,7 +1865,7 @@
 pass_stmt:      "pass"
 \end{verbatim}
 
-\verb\pass\ is a null operation -- when it is executed, nothing
+\verb\pass\ is a null operation --- when it is executed, nothing
 happens.  It is useful as a placeholder when a statement is
 required syntactically, but no code needs to be executed, for example:
 
@@ -2035,12 +2268,12 @@
 \verb\try\ suite of a \verb\try...finally\ statement, the
 \verb\finally\ clause is also executed `on the way out'.  A
 \verb\continue\ statement is illegal in the \verb\try\ clause (the
-reason is a problem with the current implementation -- this
+reason is a problem with the current implementation --- this
 restriction may be lifted in the future).
 
 \section{Function definitions} \label{function}
 
-XXX
+A function definition defines a function:
 
 \begin{verbatim}
 funcdef:        "def" identifier "(" [parameter_list] ")" ":" suite
@@ -2048,18 +2281,35 @@
 parameter:      identifier | "(" parameter_list ")"
 \end{verbatim}
 
-XXX
+A function definition is an executable statement.  Its execution binds
+the function name in the current local name space to a function object
+(a wrapper around the executable code for the function).  This
+function object contains a reference to the current global name space
+as the global name space to be used when the function is called.
+
+The function definition does not execute the function body; this gets
+executed only when the function is called.  Function call semantics
+are described elsewhere (see XXX).
 
 \section{Class definitions} \label{class}
 
-XXX
+A class definition defines a class:
 
 \begin{verbatim}
 classdef:       "class" identifier [inheritance] ":" suite
 inheritance:    "(" condition_list ")"
 \end{verbatim}
 
-XXX
+A class definition is an executable statement.  It first executes the
+inheritance list, if present.  The class's suite is executed in a new
+execution frame, using a newly created local name space and the
+original global name space.  (Usually, the suite contains only
+function definitions.)  When the class's suite finishes execution, its
+execution frame is discarded but its local name space is saved.  A
+class object (see XXX) is created using the inheritance list for the
+base classes and the saved local name space for the attribute
+dictionary.  The class name is then bound to this class object in the
+original local name space.
 
 \section{P.M.}
 
@@ -2067,4 +2317,6 @@
 XXX Syntax for interactive input, eval, exec, execfile, input
 XXX New definition of expressions (as conditions)
 
+\input{ref.ind}		% The index
+
 \end{document}