Bläddra i källkod

copy edit ch 5

Jeremy G. Siek 2 år sedan
förälder
incheckning
5f86f35062
1 ändrade filer med 35 tillägg och 33 borttagningar
  1. 35 33
      book.tex

+ 35 - 33
book.tex

@@ -7610,12 +7610,12 @@ language includes several operations that involve Booleans
 conditional expression\index{subject}{conditional expression}
 conditional expression\index{subject}{conditional expression}
 \python{ and statement\index{subject}{IfStmt@\IFSTMTNAME{}}}.
 \python{ and statement\index{subject}{IfStmt@\IFSTMTNAME{}}}.
 With the addition of \key{if}, programs can have
 With the addition of \key{if}, programs can have
-nontrivial control flow\index{subject}{control flow} which
+nontrivial control flow\index{subject}{control flow}, which
 %
 %
 \racket{impacts \code{explicate\_control} and liveness analysis.}
 \racket{impacts \code{explicate\_control} and liveness analysis.}
 %
 %
 \python{impacts liveness analysis and motivates a new pass named
 \python{impacts liveness analysis and motivates a new pass named
-  \code{explicate\_control}.}%
+  \code{explicate\_control}.}
 %
 %
 Also, because we now have two kinds of values, we need to handle
 Also, because we now have two kinds of values, we need to handle
 programs that apply an operation to the wrong kind of value, such as
 programs that apply an operation to the wrong kind of value, such as
@@ -7634,7 +7634,7 @@ treats nonzero integers as if they were \racket{\code{\#t}}\python{\code{True}}.
   in Racket because \code{car} expects a pair.}
   in Racket because \code{car} expects a pair.}
 %
 %
 \python{On the other hand, \code{1[0]} results in a runtime error
 \python{On the other hand, \code{1[0]} results in a runtime error
-  in Python because an ``\code{int} object is not subscriptable''.}
+  in Python because an ``\code{int} object is not subscriptable.''}
 
 
 \racket{Typed Racket}\python{The MyPy type checker} makes similar
 \racket{Typed Racket}\python{The MyPy type checker} makes similar
 design choices as \racket{Racket}\python{Python}, except that much of the
 design choices as \racket{Racket}\python{Python}, except that much of the
@@ -7646,7 +7646,7 @@ of \racket{\code{(car 1)}}\python{\code{1[0]}}, \racket{Typed Racket}
 \racket{because Racket expects the type of the argument to be of the form
 \racket{because Racket expects the type of the argument to be of the form
   \code{(Listof T)} or \code{(Pairof T1 T2)}.}
   \code{(Listof T)} or \code{(Pairof T1 T2)}.}
 %
 %
-\python{stating that a ``value of type \code{int} is not indexable''.}
+\python{stating that a ``value of type \code{int} is not indexable.''}
 
 
 The \LangIf{} language performs type checking during compilation just as
 The \LangIf{} language performs type checking during compilation just as
 \racket{Typed Racket}\python{MyPy}. In chapter~\ref{ch:Ldyn} we study
 \racket{Typed Racket}\python{MyPy}. In chapter~\ref{ch:Ldyn} we study
@@ -8350,14 +8350,15 @@ The type of a Boolean constant is \BOOLTY{}.
 \racket{The \code{operator-types} function adds dictionary entries for
 \racket{The \code{operator-types} function adds dictionary entries for
   the new operators.}
   the new operators.}
 %
 %
-\python{Logical not requires its argument to be a \BOOLTY{} and
-  produces a \BOOLTY{}. Similarly for logical and and logical or. }
+\python{The logical \code{not} operator requires its argument to be a
+  \BOOLTY{} and produces a \BOOLTY{}. Similarly for the logical \code{and}
+  and logical \code{or} operators.}
 %
 %
 The equality operator requires the two arguments to have the same type,
 The equality operator requires the two arguments to have the same type,
 and therefore we handle it separately from the other operators.
 and therefore we handle it separately from the other operators.
 %
 %
 \python{The other comparisons (less-than, etc.) require their
 \python{The other comparisons (less-than, etc.) require their
-arguments to be of type \INTTY{} and they produce a \BOOLTY{}.}
+arguments to be of type \INTTY{}, and they produce a \BOOLTY{}.}
 %
 %
 The condition of an \code{if} must
 The condition of an \code{if} must
 be of \BOOLTY{} type, and the two branches must have the same type.
 be of \BOOLTY{} type, and the two branches must have the same type.
@@ -8421,9 +8422,9 @@ $C$ language~\citep{Kernighan:1988nx} in that it has labels and
 %
 %
 The \LangCIf{} language supports the same operators as \LangIf{} but
 The \LangCIf{} language supports the same operators as \LangIf{} but
 the arguments of operators are restricted to atomic expressions. The
 the arguments of operators are restricted to atomic expressions. The
-\LangCIf{} language does not include \code{if} expressions but it does
+\LangCIf{} language does not include \code{if} expressions, but it does
 include a restricted form of \code{if} statement. The condition must be
 include a restricted form of \code{if} statement. The condition must be
-a comparison and the two branches may only contain \code{goto}
+a comparison, and the two branches may contain only \code{goto}
 statements. These restrictions make it easier to translate \code{if}
 statements. These restrictions make it easier to translate \code{if}
 statements to x86.  The \LangCIf{} language also adds a \code{return}
 statements to x86.  The \LangCIf{} language also adds a \code{return}
 statement to finish the program with a specified value.
 statement to finish the program with a specified value.
@@ -8436,9 +8437,9 @@ either a \code{return} statement, a \code{goto}, or an
 A \code{goto} transfers control to the sequence of statements
 A \code{goto} transfers control to the sequence of statements
 associated with its label.
 associated with its label.
 %
 %
-The concrete syntax for \LangCIf{} is defined in
-figure~\ref{fig:c1-concrete-syntax} and the abstract syntax is defined
-in figure~\ref{fig:c1-syntax}.
+Figure~\ref{fig:c1-concrete-syntax} shows the concrete syntax for \LangCIf{},
+and figure~\ref{fig:c1-syntax} shows its
+abstract syntax.
 %
 %
 \fi}
 \fi}
 %
 %
@@ -8556,8 +8557,9 @@ in figure~\ref{fig:c1-syntax}.
 
 
 \section{The \LangXIf{} Language}
 \section{The \LangXIf{} Language}
 \label{sec:x86-if}
 \label{sec:x86-if}
+\index{subject}{x86}
 
 
-\index{subject}{x86} To implement the new logical operations, the
+To implement the new logical operations, the
 comparison operations, and the \key{if} expression\python{ and
 comparison operations, and the \key{if} expression\python{ and
   statement}, we delve further into the x86
   statement}, we delve further into the x86
 language. Figures~\ref{fig:x86-1-concrete} and \ref{fig:x86-1} present
 language. Figures~\ref{fig:x86-1-concrete} and \ref{fig:x86-1} present
@@ -8814,12 +8816,12 @@ the \code{not} operator and comparison operators must be atomic.
   in the translation of \code{if} expressions. When we recursively
   in the translation of \code{if} expressions. When we recursively
   process the two branches of the \code{if}, we generate temporary
   process the two branches of the \code{if}, we generate temporary
   variables and their initializing expressions. However, these
   variables and their initializing expressions. However, these
-  expressions may contain side effects and should only be executed
+  expressions may contain side effects and should be executed only
   when the condition of the \code{if} is true (for the ``then''
   when the condition of the \code{if} is true (for the ``then''
   branch) or false (for the ``else'' branch). The \code{Begin} provides
   branch) or false (for the ``else'' branch). The \code{Begin} provides
   a way to initialize the temporary variables within the two branches
   a way to initialize the temporary variables within the two branches
   of the \code{if} expression.  In general, the $\BEGIN{ss}{e}$
   of the \code{if} expression.  In general, the $\BEGIN{ss}{e}$
-  form execute the statements $ss$ and then returns the result of
+  form executes the statements $ss$ and then returns the result of
   expression $e$.}
   expression $e$.}
 
 
 Add cases to the \code{rco\_exp} and \code{rco\_atom} functions for
 Add cases to the \code{rco\_exp} and \code{rco\_atom} functions for
@@ -9196,10 +9198,10 @@ def create_block(stmts, basic_blocks):
 Figure~\ref{fig:explicate-control-Lif} provides a skeleton for the
 Figure~\ref{fig:explicate-control-Lif} provides a skeleton for the
 \code{explicate\_control} pass.
 \code{explicate\_control} pass.
 
 
-The \code{explicate\_effect} function has three parameters: 1) the
-expression to be compiled, 2) the already-compiled code for this
+The \code{explicate\_effect} function has three parameters: (1) the
+expression to be compiled; (2) the already-compiled code for this
 expression's \emph{continuation}, that is, the list of statements that
 expression's \emph{continuation}, that is, the list of statements that
-should execute after this expression, and 3) the dictionary of
+should execute after this expression; and (3) the dictionary of
 generated basic blocks. The \code{explicate\_effect} function returns
 generated basic blocks. The \code{explicate\_effect} function returns
 a list of \LangCIf{} statements and it may add to the dictionary of
 a list of \LangCIf{} statements and it may add to the dictionary of
 basic blocks.
 basic blocks.
@@ -9207,18 +9209,18 @@ basic blocks.
 Let's consider a few of the cases for the expression to be compiled.
 Let's consider a few of the cases for the expression to be compiled.
 If the expression to be compiled is a constant, then it can be
 If the expression to be compiled is a constant, then it can be
 discarded because it has no side effects. If it's a \CREAD{}, then it
 discarded because it has no side effects. If it's a \CREAD{}, then it
-has a side-effect and should be preserved. So the expression should be
+has a side effect and should be preserved. So the expression should be
 translated into a statement using the \code{Expr} AST class. If the
 translated into a statement using the \code{Expr} AST class. If the
 expression to be compiled is an \code{if} expression, we translate the
 expression to be compiled is an \code{if} expression, we translate the
 two branches using \code{explicate\_effect} and then translate the
 two branches using \code{explicate\_effect} and then translate the
 condition expression using \code{explicate\_pred}, which generates
 condition expression using \code{explicate\_pred}, which generates
 code for the entire \code{if}.
 code for the entire \code{if}.
 
 
-The \code{explicate\_assign} function has four parameters: 1) the
-right-hand side of the assignment, 2) the left-hand side of the
-assignment (the variable), 3) the continuation, and 4) the dictionary
+The \code{explicate\_assign} function has four parameters: (1) the
+right-hand side of the assignment, (2) the left-hand side of the
+assignment (the variable), (3) the continuation, and (4) the dictionary
 of basic blocks. The \code{explicate\_assign} function returns a list
 of basic blocks. The \code{explicate\_assign} function returns a list
-of \LangCIf{} statements and it may add to the dictionary of basic
+of \LangCIf{} statements, and it may add to the dictionary of basic
 blocks.
 blocks.
 
 
 When the right-hand side is an \code{if} expression, there is some
 When the right-hand side is an \code{if} expression, there is some
@@ -9544,24 +9546,24 @@ with a \key{goto}.
 {\if\edition\pythonEd\pythonColor
 {\if\edition\pythonEd\pythonColor
 %
 %
 The last of the auxiliary functions is \code{explicate\_stmt}.  It has
 The last of the auxiliary functions is \code{explicate\_stmt}.  It has
-three parameters: 1) the statement to be compiled, 2) the code for its
-continuation, and 3) the dictionary of basic blocks. The
-\code{explicate\_stmt} returns a list of statements and it may add to
+three parameters: (1) the statement to be compiled, (2) the code for its
+continuation, and (3) the dictionary of basic blocks. The
+\code{explicate\_stmt} returns a list of statements, and it may add to
 the dictionary of basic blocks. The cases for assignment and an
 the dictionary of basic blocks. The cases for assignment and an
 expression-statement are given in full in the skeleton code: they
 expression-statement are given in full in the skeleton code: they
 simply dispatch to \code{explicate\_assign} and
 simply dispatch to \code{explicate\_assign} and
 \code{explicate\_effect}, respectively. The case for \code{if}
 \code{explicate\_effect}, respectively. The case for \code{if}
-statements is not given, and is similar to the case for \code{if}
+statements is not given; it is similar to the case for \code{if}
 expressions.
 expressions.
 
 
 The \code{explicate\_control} function itself is given in
 The \code{explicate\_control} function itself is given in
 figure~\ref{fig:explicate-control-Lif}. It applies
 figure~\ref{fig:explicate-control-Lif}. It applies
 \code{explicate\_stmt} to each statement in the program, from back to
 \code{explicate\_stmt} to each statement in the program, from back to
-front. Thus, the result so-far, stored in \code{new\_body}, can be
+front. Thus, the result so far, stored in \code{new\_body}, can be
 used as the continuation parameter in the next call to
 used as the continuation parameter in the next call to
 \code{explicate\_stmt}. The \code{new\_body} is initialized to a
 \code{explicate\_stmt}. The \code{new\_body} is initialized to a
 \code{Return} statement. Once complete, we add the \code{new\_body} to
 \code{Return} statement. Once complete, we add the \code{new\_body} to
-the dictionary of basic blocks, labeling it as the ``start'' block.
+the dictionary of basic blocks, labeling it the ``start'' block.
 %
 %
 \fi}
 \fi}
 
 
@@ -10353,7 +10355,7 @@ promise, \code{force} simply returns the argument.
 %
 %
 {\if\edition\pythonEd\pythonColor
 {\if\edition\pythonEd\pythonColor
   %
   %
-While Python does not provide direct support for lazy evaluation, it
+Although Python does not provide direct support for lazy evaluation, it
 is easy to mimic. We can \emph{delay} the evaluation of a computation
 is easy to mimic. We can \emph{delay} the evaluation of a computation
 by wrapping it inside a function with no parameters. We can
 by wrapping it inside a function with no parameters. We can
 \emph{force} its evaluation by calling the function. However, we might
 \emph{force} its evaluation by calling the function. However, we might
@@ -10375,12 +10377,12 @@ class Promise:
           return self.cache
           return self.cache
 \end{lstlisting}
 \end{lstlisting}
 %
 %
-However, in some cases of \code{explicate\_pred}, etc., we will return
-a list of statements and in other cases we will return a function that
+However, in some cases of \code{explicate\_pred} we will return a list
+of statements, and in other cases we will return a function that
 computes a list of statements.  To uniformly deal with both regular
 computes a list of statements.  To uniformly deal with both regular
 data and promises, we define the following \code{force} function that
 data and promises, we define the following \code{force} function that
 checks whether its input is delayed (i.e., whether it is a
 checks whether its input is delayed (i.e., whether it is a
-\code{Promise}) and then either 1) forces the promise , or 2) returns
+\code{Promise}) and then either (1) forces the promise or (2) returns
 the input.
 the input.
 %
 %
 \begin{lstlisting}
 \begin{lstlisting}