diff options
author | Guido van Rossum <guido@python.org> | 1992-01-28 18:10:46 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-01-28 18:10:46 (GMT) |
commit | 255ad6e659394ea038587c98bfba5a9b9b56c19c (patch) | |
tree | 32ab0c4f56227ea94bdb850be74e4aeeb5fa7db8 /Doc | |
parent | 3bead0984c802a2f709076bb9c8531fc67f56ee8 (diff) | |
download | cpython-255ad6e659394ea038587c98bfba5a9b9b56c19c.zip cpython-255ad6e659394ea038587c98bfba5a9b9b56c19c.tar.gz cpython-255ad6e659394ea038587c98bfba5a9b9b56c19c.tar.bz2 |
Described some more standard types and statements.
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/ref.tex | 334 | ||||
-rw-r--r-- | Doc/ref/ref.tex | 334 |
2 files changed, 608 insertions, 60 deletions
diff --git a/Doc/ref.tex b/Doc/ref.tex index 57c841e..61fe0db 100644 --- a/Doc/ref.tex +++ b/Doc/ref.tex @@ -3,8 +3,7 @@ \documentstyle[11pt,myformat]{report} \title{\bf - Python Reference Manual \\ - {\em Incomplete Draft} + Python Reference Manual } \author{ @@ -88,11 +87,6 @@ standard modules. These are not documented here, but in the separate mentioned when they interact in a significant way with the language definition. -\section{Warning} - -This version of the manual is incomplete. Sections that still need to -be written or need considerable work are marked with ``XXX''. - \section{Notation} The descriptions of lexical analysis and syntax use a modified BNF @@ -648,29 +642,83 @@ not contain null bytes.) \end{description} % Mapping types \item[Callable types] -These are the types to which the function call operation can be applied: +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] -XXX -\item[Built-in functions] -XXX +A user-defined function is created by a function definition (starting +with the \verb\def\ keyword). 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] -XXX +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] -XXX -\item[User-defined classes] -XXX +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] +A module object is a container for a module's name space, which is a +dictionary (the same dictionary as referenced by the +\ver\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). + +There are two 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] XXX \item[Class instances] XXX \item[Files] -XXX +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. @@ -678,10 +726,57 @@ Their definition may change with future versions of the interpreter, but they are mentioned here for completeness. \begin{description} + \item[Code objects] -XXX +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] -XXX +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 @@ -1120,8 +1215,8 @@ Mappings (dictionaries) are compared through lexicographic comparison of their sorted (key, value) lists.% \footnote{This is expensive since it requires sorting the keys first, but about the only sensible definition. It was tried to compare -dictionaries using the following rules, but this gave surprises in -cases like \verb|if d == {}: ...|.} +dictionaries using the rule below for most other types, but this gave +surprises in cases like \verb|if d == {}: ...|.} \item Most other types compare unequal unless they are the same object; @@ -1209,7 +1304,6 @@ Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: \begin{verbatim} -stmt_list: simple_stmt (";" simple_stmt)* [";"] simple_stmt: expression_stmt | assignment | pass_stmt @@ -1503,8 +1597,10 @@ import_stmt: "import" identifier ("," identifier)* Import statements are executed in two steps: (1) find a module, and initialize it if necessary; (2) define a name or names in the local -name space. The first form (without \verb\from\) repeats these steps -for each identifier in the list. +name space (of the scope where the \verb\import\ statement occurs). +The first form (without \verb\from\) repeats these steps for each +identifier in the list, the \verb\from\ form performs them once, with +the first identifier specifying the module name. The system maintains a table of modules that have been initialized, indexed by module name. (The current implementation makes this table @@ -1520,8 +1616,35 @@ path; it is initialized from the shell environment variable If a built-in module is found, its built-in initialization code is executed and step (1) is finished. If no matching file is found, -\verb\ImportError\ is raised (and step (2) is never started). If a file is -found, it is parsed. If a syntax error occurs, HIRO +\verb\ImportError\ is raised. If a file is found, it is parsed, +yielding an executable code block. If a syntax error occurs, +\verb\SyntaxError\ is raised. Otherwise, an empty module of the given +name is created and inserted in the module table, and then the code +block is executed in the context of this module. Exceptions during +this execution terminate step (1). + +When step (1) finishes without raising an exception, step (2) can +begin. + +The first form of \verb\import\ statement binds the module name in the +local name space to the module object, and then goes on to import the +next identifier, if any. The \verb\from\ from does not bind the +module name: it goes through the list of identifiers, looks each one +of them up in the module found in step (1), and binds the name in the +local name space to the object thus found. If a name is not found, +\verb\ImportError\ is raised. If the list of identifiers is replaced +by a star (\verb\*\), all names defined in the module are bound, +except those beginning with an underscore(\verb\_\). + +Names bound by import statements may not occur in \verb\global\ +statements in the same scope. + +The \verb\from\ form with \verb\*\ may only occur in a module scope. + +(The current implementation does not enforce the latter two +restrictions, but programs should not abuse this freedom, as future +implementations may enforce them or silently change the meaning of the +program.) \section{The {\tt global} statement} @@ -1529,47 +1652,198 @@ found, it is parsed. If a syntax error occurs, HIRO global_stmt: "global" identifier ("," identifier)* \end{verbatim} -(XXX To be done.) +The \verb\global\ statement is a declaration which holds for the +entire current scope. It means that the listed identifiers are to be +interpreted as globals. While {\em using} global names is automatic +if they are not defined in the local scope, {\em assigning} to global +names would be impossible without \verb\global\. + +Names listed in a \verb\global\ statement must not be used in the same +scope before that \verb\global\ statement is executed. + +Name listed in a \verb\global\ statement must not be defined as formal +parameters or in a \verb\for\ loop control target, \verb\class\ +definition, function definition, or \verb\import\ statement. + +(The current implementation does not enforce the latter two +restrictions, but programs should not abuse this freedom, as future +implementations may enforce them or silently change the meaning of the +program.) \chapter{Compound statements} -(XXX The semantic definitions of this chapter are still to be done.) +Compound statements contain (groups of) other statements; they affect +or control the execution of those other statements in some way. + +The \verb\if\, \verb\while\ and \verb\for\ statements implement +traditional control flow constructs. \verb\try\ specifies exception +handlers and/or cleanup code for a group of statements. Function and +class definitions are also syntactically compound statements. + +Compound statements consist of one or more `clauses'. A clause +consists of a header and a `suite'. The clause headers of a +particular compound statement are all at the same indentation level; +all clauses begin with a uniquely identifying keyword and end with a +colon. A suite is a group of statements controlled by a clause. A +suite can be a bunch of semicolon-separated simple statements on the +same line as the header, following the colon, or it can be a list of +indented statements. Only the latter form of suite can contain nested +compound statements; the following is illegal (mostly because it +wouldn't be clear what to do with \verb\else\): + +\begin{verbatim} +if test1: if test2: print x +\end{verbatim} + +Also note that the semicolon binds tighter that the colon in this +context (so to speak), so that in the following example, either all or +none of the \verb\print\ statements are executed: + +\begin{verbatim} +if some_test: print x; print y; print z +\end{verbatim} + +Summarizing: \begin{verbatim} -statement: stmt_list NEWLINE | compound_stmt compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef -suite: statement | NEWLINE INDENT statement+ DEDENT +suite: stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT +statement: stmt_list NEWLINE | compound_stmt +stmt_list: simple_stmt (";" simple_stmt)* [";"] \end{verbatim} +Note that statements always ends in a \verb\NEWLINE\ possibly followed +by a \verb\DEDENT\. + +Also note that optional continuation clauses always begin with a +keyword that cannot start a statement, thus there are no ambiguities +(the `dangling \verb\else\' problem is solved in Python by requiring +nested \verb\if\ statements to be indented). + +The formatting of the grammar rules in the following section places +each clause on a separate line for clarity. + \section{The {\tt if} statement} +The \verb\if\ statement is used for conditional execution: + \begin{verbatim} if_stmt: "if" condition ":" suite ("elif" condition ":" suite)* ["else" ":" suite] \end{verbatim} +It selects exactly one of the suites, by testing the conditions one by +one until one is true; then that suite is executed. If all conditions +are false, the suite of the \verb\else\ clause is executed, if present. + \section{The {\tt while} statement} +The \verb\while\ statement is used for repeated execution as long as a +condition is true: + \begin{verbatim} -while_stmt: "while" condition ":" suite ["else" ":" suite] +while_stmt: "while" condition ":" suite + ["else" ":" suite] \end{verbatim} +This repeatedly tests the condition and, if it is true, executes the +first suite; if the condition is false (which may be the first time it +is tested) the suite of the \verb\else\ clause is executed, if +present, and the loop terminates. + +A \verb\break\ statement executed in the first suite terminates the +loop without executing the \verb\else\ clause's suite. A +\verb\continue\ statement executed in the first suited skips the rest +of the suite and goes back to testing the condition. + \section{The {\tt for} statement} +The \verb\for\ statement is used to iterate over the elements of a +sequence (string, tuple or list): + \begin{verbatim} for_stmt: "for" target_list "in" condition_list ":" suite ["else" ":" suite] \end{verbatim} +The suite is executed once for each item in the condition list, in the +order of ascending indices. Each item in turn is assigned to the +target list using the standard rules for assignments, and then the +suite is executed. When the list is exhausted (which is immediately +when the sequence is empty), the suite in the \verb\else\ clause is +executed, if present. + +A \verb\break\ statement executed in the first suite terminates the +loop without executing the \verb\else\ clause's suite. A +\verb\continue\ statement executed in the first suited skips the rest +of the suite and continues with the next item or with the \verb\else\ +clause. + +The suite may assign to the variable(s) in the target list; this does +not affect the next item assigned to it. + +The target list are not deleted when the loop is finished (but if the +loop has executed 0 times it will not have been assigned to at all by +the loop). + +The built-in function \verb\range()\ returns a sequence of integers +suitable to emulate the effect of Pascal's \verb\for i := 1 to n do\. + +{\bf Warning:} There is a subtlety when the sequence is being modified +by the loop (this can only occur for lists). An internal counter is +used to keep track of which item is used next, and this is incremented +on each iteration. When this counter has reached the end of the +sequence the loop terminates. This means that if the suite deletes +the current (or a previous) item from the sequence, the next item will +be skipped (since it gets the index of the current item and this has +already been treated). Likewise, if the suite inserts an item in the +sequence before the current item, the current item will be treated +again the next time through the loop. This can lead to nasty bugs +that can be avoided by making a temporary copy using the \ + \section{The {\tt try} statement} +The \verb\try\ statement specifies exception handlers and/or cleanup +code for a group of statements: + \begin{verbatim} try_stmt: "try" ":" suite ("except" condition ["," condition] ":" suite)* + ["except" ":" suite] ["finally" ":" suite] \end{verbatim} +There are really two forms: \verb\try...except\ and +\verb\try...finally\. A \verb\try\ statement with both types of +clauses is equivalent to a \verb\try...finally\ statement with a +\verb\try...except\ statement in its \verb\try\ clause. A \verb\try\ +statement with neither a \verb\except\ clause nor a \verb\finally\ +clause just executes the suite of statements in its \verb\try\ clause. + +The \verb\try...except\ form specifies one or more exception handlers. +When no exception occurs in the \verb\try\ clause, no exception +handler is executed. When an exception occurs in the \verb\try\ +suite, a search for an exception handler HIRO + +The \verb\try...finally\ form specifies a `cleanup' handler. The +\verb\try\ clause is executed. When no exception occurs, the +\verb\finally\ clause is executed. When an exception occurs on the +\verb\try\ clause, the exception is temporarily saved, the +\verb\finally\ clause is executed, and then the saved exception is +re-raised. If the \verb\finally\ clause raises another exception or +executes a \verb\return\, \verb\break\ or \verb\continue\ statement, +the saved exception is lost. + +When a \verb\return\ or \verb\break\ statement is executed in the +\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 +restriction may be lifted in the future). + + + \section{Function definitions} \begin{verbatim} diff --git a/Doc/ref/ref.tex b/Doc/ref/ref.tex index 57c841e..61fe0db 100644 --- a/Doc/ref/ref.tex +++ b/Doc/ref/ref.tex @@ -3,8 +3,7 @@ \documentstyle[11pt,myformat]{report} \title{\bf - Python Reference Manual \\ - {\em Incomplete Draft} + Python Reference Manual } \author{ @@ -88,11 +87,6 @@ standard modules. These are not documented here, but in the separate mentioned when they interact in a significant way with the language definition. -\section{Warning} - -This version of the manual is incomplete. Sections that still need to -be written or need considerable work are marked with ``XXX''. - \section{Notation} The descriptions of lexical analysis and syntax use a modified BNF @@ -648,29 +642,83 @@ not contain null bytes.) \end{description} % Mapping types \item[Callable types] -These are the types to which the function call operation can be applied: +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] -XXX -\item[Built-in functions] -XXX +A user-defined function is created by a function definition (starting +with the \verb\def\ keyword). 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] -XXX +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] -XXX -\item[User-defined classes] -XXX +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] +A module object is a container for a module's name space, which is a +dictionary (the same dictionary as referenced by the +\ver\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). + +There are two 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] XXX \item[Class instances] XXX \item[Files] -XXX +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. @@ -678,10 +726,57 @@ Their definition may change with future versions of the interpreter, but they are mentioned here for completeness. \begin{description} + \item[Code objects] -XXX +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] -XXX +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 @@ -1120,8 +1215,8 @@ Mappings (dictionaries) are compared through lexicographic comparison of their sorted (key, value) lists.% \footnote{This is expensive since it requires sorting the keys first, but about the only sensible definition. It was tried to compare -dictionaries using the following rules, but this gave surprises in -cases like \verb|if d == {}: ...|.} +dictionaries using the rule below for most other types, but this gave +surprises in cases like \verb|if d == {}: ...|.} \item Most other types compare unequal unless they are the same object; @@ -1209,7 +1304,6 @@ Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: \begin{verbatim} -stmt_list: simple_stmt (";" simple_stmt)* [";"] simple_stmt: expression_stmt | assignment | pass_stmt @@ -1503,8 +1597,10 @@ import_stmt: "import" identifier ("," identifier)* Import statements are executed in two steps: (1) find a module, and initialize it if necessary; (2) define a name or names in the local -name space. The first form (without \verb\from\) repeats these steps -for each identifier in the list. +name space (of the scope where the \verb\import\ statement occurs). +The first form (without \verb\from\) repeats these steps for each +identifier in the list, the \verb\from\ form performs them once, with +the first identifier specifying the module name. The system maintains a table of modules that have been initialized, indexed by module name. (The current implementation makes this table @@ -1520,8 +1616,35 @@ path; it is initialized from the shell environment variable If a built-in module is found, its built-in initialization code is executed and step (1) is finished. If no matching file is found, -\verb\ImportError\ is raised (and step (2) is never started). If a file is -found, it is parsed. If a syntax error occurs, HIRO +\verb\ImportError\ is raised. If a file is found, it is parsed, +yielding an executable code block. If a syntax error occurs, +\verb\SyntaxError\ is raised. Otherwise, an empty module of the given +name is created and inserted in the module table, and then the code +block is executed in the context of this module. Exceptions during +this execution terminate step (1). + +When step (1) finishes without raising an exception, step (2) can +begin. + +The first form of \verb\import\ statement binds the module name in the +local name space to the module object, and then goes on to import the +next identifier, if any. The \verb\from\ from does not bind the +module name: it goes through the list of identifiers, looks each one +of them up in the module found in step (1), and binds the name in the +local name space to the object thus found. If a name is not found, +\verb\ImportError\ is raised. If the list of identifiers is replaced +by a star (\verb\*\), all names defined in the module are bound, +except those beginning with an underscore(\verb\_\). + +Names bound by import statements may not occur in \verb\global\ +statements in the same scope. + +The \verb\from\ form with \verb\*\ may only occur in a module scope. + +(The current implementation does not enforce the latter two +restrictions, but programs should not abuse this freedom, as future +implementations may enforce them or silently change the meaning of the +program.) \section{The {\tt global} statement} @@ -1529,47 +1652,198 @@ found, it is parsed. If a syntax error occurs, HIRO global_stmt: "global" identifier ("," identifier)* \end{verbatim} -(XXX To be done.) +The \verb\global\ statement is a declaration which holds for the +entire current scope. It means that the listed identifiers are to be +interpreted as globals. While {\em using} global names is automatic +if they are not defined in the local scope, {\em assigning} to global +names would be impossible without \verb\global\. + +Names listed in a \verb\global\ statement must not be used in the same +scope before that \verb\global\ statement is executed. + +Name listed in a \verb\global\ statement must not be defined as formal +parameters or in a \verb\for\ loop control target, \verb\class\ +definition, function definition, or \verb\import\ statement. + +(The current implementation does not enforce the latter two +restrictions, but programs should not abuse this freedom, as future +implementations may enforce them or silently change the meaning of the +program.) \chapter{Compound statements} -(XXX The semantic definitions of this chapter are still to be done.) +Compound statements contain (groups of) other statements; they affect +or control the execution of those other statements in some way. + +The \verb\if\, \verb\while\ and \verb\for\ statements implement +traditional control flow constructs. \verb\try\ specifies exception +handlers and/or cleanup code for a group of statements. Function and +class definitions are also syntactically compound statements. + +Compound statements consist of one or more `clauses'. A clause +consists of a header and a `suite'. The clause headers of a +particular compound statement are all at the same indentation level; +all clauses begin with a uniquely identifying keyword and end with a +colon. A suite is a group of statements controlled by a clause. A +suite can be a bunch of semicolon-separated simple statements on the +same line as the header, following the colon, or it can be a list of +indented statements. Only the latter form of suite can contain nested +compound statements; the following is illegal (mostly because it +wouldn't be clear what to do with \verb\else\): + +\begin{verbatim} +if test1: if test2: print x +\end{verbatim} + +Also note that the semicolon binds tighter that the colon in this +context (so to speak), so that in the following example, either all or +none of the \verb\print\ statements are executed: + +\begin{verbatim} +if some_test: print x; print y; print z +\end{verbatim} + +Summarizing: \begin{verbatim} -statement: stmt_list NEWLINE | compound_stmt compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef -suite: statement | NEWLINE INDENT statement+ DEDENT +suite: stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT +statement: stmt_list NEWLINE | compound_stmt +stmt_list: simple_stmt (";" simple_stmt)* [";"] \end{verbatim} +Note that statements always ends in a \verb\NEWLINE\ possibly followed +by a \verb\DEDENT\. + +Also note that optional continuation clauses always begin with a +keyword that cannot start a statement, thus there are no ambiguities +(the `dangling \verb\else\' problem is solved in Python by requiring +nested \verb\if\ statements to be indented). + +The formatting of the grammar rules in the following section places +each clause on a separate line for clarity. + \section{The {\tt if} statement} +The \verb\if\ statement is used for conditional execution: + \begin{verbatim} if_stmt: "if" condition ":" suite ("elif" condition ":" suite)* ["else" ":" suite] \end{verbatim} +It selects exactly one of the suites, by testing the conditions one by +one until one is true; then that suite is executed. If all conditions +are false, the suite of the \verb\else\ clause is executed, if present. + \section{The {\tt while} statement} +The \verb\while\ statement is used for repeated execution as long as a +condition is true: + \begin{verbatim} -while_stmt: "while" condition ":" suite ["else" ":" suite] +while_stmt: "while" condition ":" suite + ["else" ":" suite] \end{verbatim} +This repeatedly tests the condition and, if it is true, executes the +first suite; if the condition is false (which may be the first time it +is tested) the suite of the \verb\else\ clause is executed, if +present, and the loop terminates. + +A \verb\break\ statement executed in the first suite terminates the +loop without executing the \verb\else\ clause's suite. A +\verb\continue\ statement executed in the first suited skips the rest +of the suite and goes back to testing the condition. + \section{The {\tt for} statement} +The \verb\for\ statement is used to iterate over the elements of a +sequence (string, tuple or list): + \begin{verbatim} for_stmt: "for" target_list "in" condition_list ":" suite ["else" ":" suite] \end{verbatim} +The suite is executed once for each item in the condition list, in the +order of ascending indices. Each item in turn is assigned to the +target list using the standard rules for assignments, and then the +suite is executed. When the list is exhausted (which is immediately +when the sequence is empty), the suite in the \verb\else\ clause is +executed, if present. + +A \verb\break\ statement executed in the first suite terminates the +loop without executing the \verb\else\ clause's suite. A +\verb\continue\ statement executed in the first suited skips the rest +of the suite and continues with the next item or with the \verb\else\ +clause. + +The suite may assign to the variable(s) in the target list; this does +not affect the next item assigned to it. + +The target list are not deleted when the loop is finished (but if the +loop has executed 0 times it will not have been assigned to at all by +the loop). + +The built-in function \verb\range()\ returns a sequence of integers +suitable to emulate the effect of Pascal's \verb\for i := 1 to n do\. + +{\bf Warning:} There is a subtlety when the sequence is being modified +by the loop (this can only occur for lists). An internal counter is +used to keep track of which item is used next, and this is incremented +on each iteration. When this counter has reached the end of the +sequence the loop terminates. This means that if the suite deletes +the current (or a previous) item from the sequence, the next item will +be skipped (since it gets the index of the current item and this has +already been treated). Likewise, if the suite inserts an item in the +sequence before the current item, the current item will be treated +again the next time through the loop. This can lead to nasty bugs +that can be avoided by making a temporary copy using the \ + \section{The {\tt try} statement} +The \verb\try\ statement specifies exception handlers and/or cleanup +code for a group of statements: + \begin{verbatim} try_stmt: "try" ":" suite ("except" condition ["," condition] ":" suite)* + ["except" ":" suite] ["finally" ":" suite] \end{verbatim} +There are really two forms: \verb\try...except\ and +\verb\try...finally\. A \verb\try\ statement with both types of +clauses is equivalent to a \verb\try...finally\ statement with a +\verb\try...except\ statement in its \verb\try\ clause. A \verb\try\ +statement with neither a \verb\except\ clause nor a \verb\finally\ +clause just executes the suite of statements in its \verb\try\ clause. + +The \verb\try...except\ form specifies one or more exception handlers. +When no exception occurs in the \verb\try\ clause, no exception +handler is executed. When an exception occurs in the \verb\try\ +suite, a search for an exception handler HIRO + +The \verb\try...finally\ form specifies a `cleanup' handler. The +\verb\try\ clause is executed. When no exception occurs, the +\verb\finally\ clause is executed. When an exception occurs on the +\verb\try\ clause, the exception is temporarily saved, the +\verb\finally\ clause is executed, and then the saved exception is +re-raised. If the \verb\finally\ clause raises another exception or +executes a \verb\return\, \verb\break\ or \verb\continue\ statement, +the saved exception is lost. + +When a \verb\return\ or \verb\break\ statement is executed in the +\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 +restriction may be lifted in the future). + + + \section{Function definitions} \begin{verbatim} |