Browse Source

more specific about \Arg

Jeremy Siek 9 years ago
parent
commit
15c2d356cd
1 changed files with 28 additions and 26 deletions
  1. 28 26
      book.tex

+ 28 - 26
book.tex

@@ -1504,25 +1504,26 @@ $\Rightarrow$
 We recommend implementing \key{flatten} as a structurally recursive
 We recommend implementing \key{flatten} as a structurally recursive
 function that returns two things, 1) the newly flattened expression,
 function that returns two things, 1) the newly flattened expression,
 and 2) a list of assignment statements, one for each of the new
 and 2) a list of assignment statements, one for each of the new
-variables introduced while flattening the expression.  The newly
-flattened expression should be a \emph{simple} expression, that is, an
-integer or a variable. (There will be more kinds of simple expressions
-in the input languages of later Chapters.) You can return multiple
-things from a function using the \key{values} form and you can receive
-multiple things from a function call using the \key{define-values}
-form. If you are not familiar with these constructs, the Racket
-documentation will be of help. Also, the \key{map2} function
-(Appendix~\ref{appendix:utilities}) is useful for applying a function
-to each element of a list, in the case where the function returns two
-values. The result of \key{map2} is two lists.
+variables introduced during the flattening the expression.  The newly
+flattened expression should be an $\Arg$ in the $C_0$ syntax
+(Figure~\ref{fig:c0-syntax}), that is, it should be an integer or a
+variable. You can return multiple things from a function using the
+\key{values} form and you can receive multiple things from a function
+call using the \key{define-values} form. If you are not familiar with
+these constructs, the Racket documentation will be of help. Also, the
+\key{map2} function (Appendix~\ref{appendix:utilities}) is useful for
+applying a function to each element of a list, in the case where the
+function returns two values. The result of \key{map2} is two lists.
 
 
 The clause of \key{flatten} for the \key{program} node needs to
 The clause of \key{flatten} for the \key{program} node needs to
-recursively flatten the body of the program and also compute the list
-of variables used in the program.  I recommend traversing the
-statements in the body of the program (after it has been flattened)
-and collect all variables that appear on the left-hand-side of an
-assignment. Note that each variable should only occur once in the list
-of variables that you place in the \key{program} form.
+recursively flatten the body of the program and the newly flattened
+expression should be placed in a \key{return} statment.  The
+\key{flatten} pass should also compute the list of variables used in
+the program.  I recommend traversing the statements in the body of the
+program (after it has been flattened) and collect all variables that
+appear on the left-hand-side of an assignment. Note that each variable
+should only occur once in the list of variables that you place in the
+\key{program} form.
 
 
 Take special care for programs such as the following that initialize
 Take special care for programs such as the following that initialize
 variables with integers or other variables. It should be translated
 variables with integers or other variables. It should be translated
@@ -2652,17 +2653,18 @@ $\Rightarrow$
 \end{tabular} \\
 \end{tabular} \\
 The value of the \key{if} expression is the value of the branch that
 The value of the \key{if} expression is the value of the branch that
 is selected. Recall that in the \code{flatten} pass we need to replace
 is selected. Recall that in the \code{flatten} pass we need to replace
-complex expressions with simple expressions (variables or
-literals). In the translation above, on the right, we have translated
-the \key{if} expression into a new variable \key{if.1} and we have
-produced code that will assign the appropriate value to \key{if.1}.
-For $R_1$, the \code{flatten} pass returned a list of assignment
-statements. Here, for $R_2$, we return a list of statements that can
-include both \key{if} statements and assignment statements.
+arbitrary expressions with $\Arg$'s (variables or literals). In the
+translation above, on the right, we have translated the \key{if}
+expression into a new variable \key{if.1} and we have produced code
+that will assign the appropriate value to \key{if.1}.  For $R_1$, the
+\code{flatten} pass returned a list of assignment statements. Here,
+for $R_2$, we return a list of statements that can include both
+\key{if} statements and assignment statements.
 
 
 The next example is a bit more involved, showing what happens when
 The next example is a bit more involved, showing what happens when
-there are complex expressions in the condition and branch expressions
-of an \key{if}, including nested \key{if} expressions.
+there are complex expressions (not variables or literals) in the
+condition and branch expressions of an \key{if}, including nested
+\key{if} expressions.
 
 
 \begin{tabular}{lll}
 \begin{tabular}{lll}
 \begin{minipage}{0.4\textwidth}
 \begin{minipage}{0.4\textwidth}