Jeremy Siek vor 3 Jahren
Ursprung
Commit
94e29f7dd4
2 geänderte Dateien mit 257 neuen und 246 gelöschten Zeilen
  1. 254 243
      book.tex
  2. 3 3
      defs.tex

+ 254 - 243
book.tex

@@ -18289,7 +18289,7 @@ UNDER CONSTRUCTION
 
 
 This chapter studies a language, \LangGrad{}, in which the programmer
 This chapter studies a language, \LangGrad{}, in which the programmer
 can choose between static and dynamic type checking in different parts
 can choose between static and dynamic type checking in different parts
-of a program, thereby mixing the statically typed \LangLoop{} language
+of a program, thereby mixing the statically typed \LangLam{} language
 with the dynamically typed \LangDyn{}. There are several approaches to
 with the dynamically typed \LangDyn{}. There are several approaches to
 mixing static and dynamic typing, including multi-language
 mixing static and dynamic typing, including multi-language
 integration~\citep{Tobin-Hochstadt:2006fk,Matthews:2007zr} and hybrid
 integration~\citep{Tobin-Hochstadt:2006fk,Matthews:2007zr} and hybrid
@@ -18300,48 +18300,59 @@ adding or removing type annotations on parameters and
 variables~\citep{Anderson:2002kd,Siek:2006bh}.
 variables~\citep{Anderson:2002kd,Siek:2006bh}.
 %
 %
 The concrete syntax of \LangGrad{} is defined in
 The concrete syntax of \LangGrad{} is defined in
-Figure~\ref{fig:Rgrad-concrete-syntax} and its abstract syntax is defined
-in Figure~\ref{fig:Rgrad-syntax}. The main syntactic difference between
-\LangLoop{} and \LangGrad{} is the additional \itm{param} and \itm{ret}
+Figure~\ref{fig:Lgrad-concrete-syntax} and its abstract syntax is defined
+in Figure~\ref{fig:Lgrad-syntax}. The main syntactic difference between
+\LangLam{} and \LangGrad{} is the additional \itm{param} and \itm{ret}
 non-terminals that make type annotations optional. The return types
 non-terminals that make type annotations optional. The return types
 are not optional in the abstract syntax; the parser fills in
 are not optional in the abstract syntax; the parser fills in
 \code{Any} when the return type is not specified in the concrete
 \code{Any} when the return type is not specified in the concrete
 syntax.
 syntax.
 
 
+\newcommand{\LgradGrammarRacket}{
+\begin{array}{lcl}
+  \Type &::=& (\Type \ldots \; \key{->}\; \Type) \\
+  \itm{param} &::=& \Var \MID \LS\Var \key{:} \Type\RS \\
+  \itm{ret} &::=& \epsilon \MID \key{:} \Type \\
+  \Exp &::=& \LP\Exp \; \Exp \ldots\RP 
+      \MID \CGLAMBDA{\LP\itm{param}\ldots\RP}{\itm{ret}}{\Exp} \\
+    &\MID& \LP \key{procedure-arity}~\Exp\RP \\
+  \Def &::=& \CGDEF{\Var}{\itm{param}\ldots}{\itm{ret}}{\Exp} 
+\end{array}
+}
+
+\newcommand{\LgradASTRacket}{
+\begin{array}{lcl}
+  \Type &::=& (\Type \ldots \; \key{->}\; \Type) \\
+  \itm{param} &::=& \Var \MID \LS\Var \key{:} \Type\RS \\
+  \Exp &::=& \APPLY{\Exp}{\Exp\ldots}
+  \MID \LAMBDA{\LP\itm{param}\ldots\RP}{\Type}{\Exp} \\
+  \itm{op} &::=& \code{procedure-arity} \\
+ \Def &::=& \FUNDEF{\Var}{\LP\itm{param}\ldots\RP}{\Type}{\code{'()}}{\Exp} 
+\end{array}
+}
+
 \begin{figure}[tp]
 \begin{figure}[tp]
 \centering
 \centering
 \fbox{
 \fbox{
   \begin{minipage}{0.96\textwidth}
   \begin{minipage}{0.96\textwidth}
     \small
     \small
 \[
 \[
+\begin{array}{l}
+  \gray{\LintGrammarRacket{}} \\ \hline
+  \gray{\LvarGrammarRacket{}} \\ \hline
+  \gray{\LifGrammarRacket{}} \\ \hline
+  \gray{\LwhileGrammarRacket} \\ \hline
+  \gray{\LtupGrammarRacket} \\   \hline
+  \LgradGrammarRacket \\
 \begin{array}{lcl}
 \begin{array}{lcl}
-  \itm{param} &::=& \Var \MID \LS\Var \key{:} \Type\RS \\
-  \itm{ret} &::=& \epsilon \MID \key{:} \Type \\
-  \Exp &::=& \gray{ \Int \MID \CREAD{} \MID \CNEG{\Exp}
-     \MID \CADD{\Exp}{\Exp} \MID \CSUB{\Exp}{\Exp} }  \\
-    &\MID&  \gray{ \Var \MID \CLET{\Var}{\Exp}{\Exp} }\\
-    &\MID& \gray{\key{\#t} \MID \key{\#f} 
-     \MID (\key{and}\;\Exp\;\Exp) 
-     \MID (\key{or}\;\Exp\;\Exp) 
-     \MID (\key{not}\;\Exp) } \\
-    &\MID& \gray{ (\key{eq?}\;\Exp\;\Exp) \MID \CIF{\Exp}{\Exp}{\Exp} } \\
-    &\MID& \gray{ (\key{vector}\;\Exp\ldots) \MID
-          (\key{vector-ref}\;\Exp\;\Int)} \\
-    &\MID& \gray{(\key{vector-set!}\;\Exp\;\Int\;\Exp)\MID (\key{void})
-    \MID (\Exp \; \Exp\ldots) } \\
-    &\MID& \gray{ \LP \key{procedure-arity}~\Exp\RP }
-    \MID \CGLAMBDA{\LP\itm{param}\ldots\RP}{\itm{ret}}{\Exp} \\
-  &\MID& \gray{ \CSETBANG{\Var}{\Exp}
-  \MID \CBEGIN{\Exp\ldots}{\Exp}
-  \MID \CWHILE{\Exp}{\Exp} } \\
-  \Def &::=& \CGDEF{\Var}{\itm{param}\ldots}{\itm{ret}}{\Exp} \\
   \LangGradM{} &::=& \gray{\Def\ldots \; \Exp}
   \LangGradM{} &::=& \gray{\Def\ldots \; \Exp}
 \end{array}
 \end{array}
+\end{array}
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The concrete syntax of \LangGrad{}, extending \LangLoop{} (Figure~\ref{fig:Lwhile-concrete-syntax}).}
-\label{fig:Rgrad-concrete-syntax}
+\caption{The concrete syntax of \LangGrad{}, extending \LangVec{} (Figure~\ref{fig:Lvec-concrete-syntax}).}
+\label{fig:Lgrad-concrete-syntax}
 \end{figure}
 \end{figure}
 
 
 \begin{figure}[tp]
 \begin{figure}[tp]
@@ -18350,25 +18361,22 @@ syntax.
   \begin{minipage}{0.96\textwidth}
   \begin{minipage}{0.96\textwidth}
     \small
     \small
 \[
 \[
+\begin{array}{l}
+  \gray{\LintOpAST} \\ \hline
+  \gray{\LvarASTRacket{}} \\ \hline
+  \gray{\LifASTRacket{}} \\ \hline
+  \gray{\LwhileASTRacket{}} \\ \hline
+  \gray{\LtupASTRacket{}} \\ \hline
+  \LgradASTRacket \\
 \begin{array}{lcl}
 \begin{array}{lcl}
-  \itm{param} &::=& \Var \MID \LS\Var \key{:} \Type\RS \\
-  \Exp &::=& \gray{ \INT{\Int} \VAR{\Var} \MID \LET{\Var}{\Exp}{\Exp} } \\
-       &\MID& \gray{ \PRIM{\itm{op}}{\Exp\ldots} }\\
-     &\MID& \gray{ \BOOL{\itm{bool}}
-      \MID \IF{\Exp}{\Exp}{\Exp} } \\
-     &\MID& \gray{ \VOID{} \MID \LP\key{HasType}~\Exp~\Type \RP 
-     \MID \APPLY{\Exp}{\Exp\ldots} }\\
-  &\MID& \LAMBDA{\LP\itm{param}\ldots\RP}{\Type}{\Exp} \\
-  &\MID& \gray{ \SETBANG{\Var}{\Exp} \MID \BEGIN{\LP\Exp\ldots\RP}{\Exp} } \\
-  &\MID& \gray{ \WHILE{\Exp}{\Exp} } \\
- \Def &::=& \FUNDEF{\Var}{\LP\itm{param}\ldots\RP}{\Type}{\code{'()}}{\Exp} \\
-  \LangGradM{} &::=& \gray{ \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp} }
+  \LangGradM{} &::=& \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp}
+\end{array}
 \end{array}
 \end{array}
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The abstract syntax of \LangGrad{}, extending \LangLoop{} (Figure~\ref{fig:Lwhile-syntax}).}
-\label{fig:Rgrad-syntax}
+\caption{The abstract syntax of \LangGrad{}, extending \LangVec{} (Figure~\ref{fig:Lvec-syntax}).}
+\label{fig:Lgrad-syntax}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -18376,9 +18384,9 @@ syntax.
 Both the type checker and the interpreter for \LangGrad{} require some
 Both the type checker and the interpreter for \LangGrad{} require some
 interesting changes to enable gradual typing, which we discuss in the
 interesting changes to enable gradual typing, which we discuss in the
 next two sections in the context of the \code{map} example from
 next two sections in the context of the \code{map} example from
-Chapter~\ref{ch:Lfun}.  In Figure~\ref{fig:gradual-map} we
-revised the \code{map} example, omitting the type annotations from
-the \code{inc} function.
+Chapter~\ref{ch:Lfun}.  In Figure~\ref{fig:gradual-map} we revisit the
+\code{map} example, omitting the type annotations from the \code{inc}
+function.
 
 
 \begin{figure}[btp]
 \begin{figure}[btp]
 % gradual_test_9.rkt
 % gradual_test_9.rkt
@@ -18439,42 +18447,43 @@ because the two types are consistent.  In particular, \code{->} is
 equal to \code{->} and because \code{Any} is consistent with
 equal to \code{->} and because \code{Any} is consistent with
 \code{Integer}.
 \code{Integer}.
 
 
-Next consider a program with an error, such as applying the
-\code{map} to a function that sometimes returns a Boolean, as
-shown in Figure~\ref{fig:map-maybe-inc}.  The type checker for
-\LangGrad{} accepts this program because the type of \code{maybe-inc} is
-consistent with the type of parameter \code{f} of \code{map}, that
-is, \code{(Any -> Any)} is consistent with \code{(Integer ->
+Next consider a program with an error, such as applying \code{map} to
+a function that sometimes returns a Boolean, as shown in
+Figure~\ref{fig:map-maybe-inc}.  The type checker for \LangGrad{}
+accepts this program because the type of \code{maybe-inc} is
+consistent with the type of parameter \code{f} of \code{map}, that is,
+\code{(Any -> Any)} is consistent with \code{(Integer ->
   Integer)}. One might say that a gradual type checker is optimistic
   Integer)}. One might say that a gradual type checker is optimistic
 in that it accepts programs that might execute without a runtime type
 in that it accepts programs that might execute without a runtime type
 error.
 error.
 %
 %
 Unfortunately, running this program with input \code{1} triggers an
 Unfortunately, running this program with input \code{1} triggers an
-error when the \code{maybe-inc} function returns \code{\#t}. \LangGrad{}
-performs checking at runtime to ensure the integrity of the static
-types, such as the \code{(Integer -> Integer)} annotation on parameter
-\code{f} of \code{map}.  This runtime checking is carried out by a
-new \code{Cast} form that is inserted by the type checker.  Thus, the
-output of the type checker is a program in the \LangCast{} language, which
-adds \code{Cast} to \LangLoop{}, as shown in
-Figure~\ref{fig:Rgrad-prime-syntax}.
+error when the \code{maybe-inc} function returns \code{\#t}.  The
+\LangGrad{} language performs checking at runtime to ensure the
+integrity of the static types, such as the \code{(Integer -> Integer)}
+annotation on parameter \code{f} of \code{map}.  This runtime checking
+is carried out by a new \code{Cast} form that is inserted by the type
+checker.  Thus, the output of the type checker is a program in the
+\LangCast{} language, which adds \code{Cast} and \ANYTY{} to
+\LangLam{}.
+%, as shown in Figure~\ref{fig:Lgrad-prime-syntax}.
 
 
-\begin{figure}[tp]
-\centering
-\fbox{
-\begin{minipage}{0.96\textwidth}
-\small
-\[
-\begin{array}{lcl}
-  \Exp &::=& \ldots \MID \CAST{\Exp}{\Type}{\Type} \\
-  \LangCastM{} &::=& \gray{ \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp} }
-\end{array}
-\]
-\end{minipage}
-}
-\caption{The abstract syntax of \LangCast{}, extending \LangLoop{} (Figure~\ref{fig:Lwhile-syntax}).}
-\label{fig:Rgrad-prime-syntax}
-\end{figure}
+%% \begin{figure}[tp]
+%% \centering
+%% \fbox{
+%% \begin{minipage}{0.96\textwidth}
+%% \small
+%% \[
+%% \begin{array}{lcl}
+%%   \Exp &::=& \ldots \MID \CAST{\Exp}{\Type}{\Type} \\
+%%   \LangCastM{} &::=& \gray{ \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp} }
+%% \end{array}
+%% \]
+%% \end{minipage}
+%% }
+%% \caption{The abstract syntax of \LangCast{}, extending \LangLam{} (Figure~\ref{fig:Lwhile-syntax}).}
+%% \label{fig:Lgrad-prime-syntax}
+%% \end{figure}
 
 
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
@@ -18522,14 +18531,14 @@ is cast from \code{(Any -> Any)} to \code{(Integer -> Integer)}.
 
 
 
 
 The type checker for \LangGrad{} is defined in
 The type checker for \LangGrad{} is defined in
-Figures~\ref{fig:type-check-Rgradual-1}, \ref{fig:type-check-Rgradual-2},
-and \ref{fig:type-check-Rgradual-3}.
+Figures~\ref{fig:type-check-Lgradual-1}, \ref{fig:type-check-Lgradual-2},
+and \ref{fig:type-check-Lgradual-3}.
 
 
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 (define type-check-gradual-class
 (define type-check-gradual-class
-  (class type-check-Lwhile-class
+  (class type-check-Llambda-class
     (super-new)
     (super-new)
     (inherit operator-types type-predicates)
     (inherit operator-types type-predicates)
 
 
@@ -18587,7 +18596,7 @@ and \ref{fig:type-check-Rgradual-3}.
 	     [else (error 'type-check "expected vector not ~a\nin ~v" t1 e)])]
 	     [else (error 'type-check "expected vector not ~a\nin ~v" t1 e)])]
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checker for the \LangGrad{} language, part 1.}
 \caption{Type checker for the \LangGrad{} language, part 1.}
-\label{fig:type-check-Rgradual-1}
+\label{fig:type-check-Lgradual-1}
 \end{figure}
 \end{figure}
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
@@ -18653,7 +18662,7 @@ and \ref{fig:type-check-Rgradual-3}.
            (values (WhileLoop (make-cast e1^ T1 'Boolean) e2^) 'Void)]
            (values (WhileLoop (make-cast e1^ T1 'Boolean) e2^) 'Void)]
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checker for the \LangGrad{} language, part 2.}
 \caption{Type checker for the \LangGrad{} language, part 2.}
-\label{fig:type-check-Rgradual-2}
+\label{fig:type-check-Lgradual-2}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -18690,7 +18699,7 @@ and \ref{fig:type-check-Rgradual-3}.
           )))
           )))
 \end{lstlisting}
 \end{lstlisting}
 \caption{Type checker for the \LangGrad{} language, part 3.}
 \caption{Type checker for the \LangGrad{} language, part 3.}
-\label{fig:type-check-Rgradual-3}
+\label{fig:type-check-Lgradual-3}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -18759,7 +18768,7 @@ and \ref{fig:type-check-Rgradual-3}.
 	[else (error 'fun-def-type "ill-formed function definition in ~a" d)]))
 	[else (error 'fun-def-type "ill-formed function definition in ~a" d)]))
 \end{lstlisting}
 \end{lstlisting}
 \caption{Auxiliary functions for type checking \LangGrad{}.}
 \caption{Auxiliary functions for type checking \LangGrad{}.}
-\label{fig:type-check-Rgradual-aux}
+\label{fig:type-check-Lgradual-aux}
 \end{figure}
 \end{figure}
 
 
 \clearpage
 \clearpage
@@ -18779,7 +18788,7 @@ integer or signaling an error if it the tag is not the one for
 integers (Figure~\ref{fig:interp-Lany-aux}).
 integers (Figure~\ref{fig:interp-Lany-aux}).
 %
 %
 Things get more interesting for higher-order casts, that is, casts
 Things get more interesting for higher-order casts, that is, casts
-involving function or vector types.
+involving function or tuple types.
 
 
 Consider the cast of the function \code{maybe-inc} from \code{(Any ->
 Consider the cast of the function \code{maybe-inc} from \code{(Any ->
   Any)} to \code{(Integer -> Integer)}. When a function flows through
   Any)} to \code{(Integer -> Integer)}. When a function flows through
@@ -18792,20 +18801,20 @@ wrapping \code{maybe-inc} in a new function that casts its parameter
 from \code{Integer} to \code{Any}, applies \code{maybe-inc}, and then
 from \code{Integer} to \code{Any}, applies \code{maybe-inc}, and then
 casts the return value from \code{Any} to \code{Integer}.
 casts the return value from \code{Any} to \code{Integer}.
 
 
-Turning our attention to casts involving vector types, we consider the
+Turning our attention to casts involving tuple types, we consider the
 example in Figure~\ref{fig:map-bang} that defines a
 example in Figure~\ref{fig:map-bang} that defines a
 partially-typed version of \code{map} whose parameter \code{v} has
 partially-typed version of \code{map} whose parameter \code{v} has
 type \code{(Vector Any Any)} and that updates \code{v} in place
 type \code{(Vector Any Any)} and that updates \code{v} in place
-instead of returning a new vector. So we name this function
-\code{map!}. We apply \code{map!} to a vector of integers, so
+instead of returning a new tuple. So we name this function
+\code{map!}. We apply \code{map!} to a tuple of integers, so
 the type checker inserts a cast from \code{(Vector Integer Integer)}
 the type checker inserts a cast from \code{(Vector Integer Integer)}
 to \code{(Vector Any Any)}. A naive way for the \LangCast{} interpreter to
 to \code{(Vector Any Any)}. A naive way for the \LangCast{} interpreter to
-cast between vector types would be a build a new vector whose elements
+cast between tuple types would be a build a new tuple whose elements
 are the result of casting each of the original elements to the
 are the result of casting each of the original elements to the
 appropriate target type. However, this approach is only valid for
 appropriate target type. However, this approach is only valid for
-immutable vectors; and our vectors are mutable. In the example of
-Figure~\ref{fig:map-bang}, if the cast created a new vector, then
-the updates inside of \code{map!} would happen to the new vector
+immutable tuples; and our tuples are mutable. In the example of
+Figure~\ref{fig:map-bang}, if the cast created a new tuple, then
+the updates inside of \code{map!} would happen to the new tuple
 and not the original one.
 and not the original one.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
@@ -18827,20 +18836,20 @@ and not the original one.
 \end{figure}
 \end{figure}
 
 
 Instead the interpreter needs to create a new kind of value, a
 Instead the interpreter needs to create a new kind of value, a
-\emph{vector proxy}, that intercepts every vector operation. On a
-read, the proxy reads from the underlying vector and then applies a
+\emph{tuple proxy}, that intercepts every tuple operation. On a
+read, the proxy reads from the underlying tuple and then applies a
 cast to the resulting value.  On a write, the proxy casts the argument
 cast to the resulting value.  On a write, the proxy casts the argument
-value and then performs the write to the underlying vector. For the
+value and then performs the write to the underlying tuple. For the
 first \code{(vector-ref v 0)} in \code{map!}, the proxy casts
 first \code{(vector-ref v 0)} in \code{map!}, the proxy casts
 \code{0} from \code{Integer} to \code{Any}.  For the first
 \code{0} from \code{Integer} to \code{Any}.  For the first
 \code{vector-set!}, the proxy casts a tagged \code{1} from \code{Any}
 \code{vector-set!}, the proxy casts a tagged \code{1} from \code{Any}
 to \code{Integer}.
 to \code{Integer}.
 
 
 The final category of cast that we need to consider are casts between
 The final category of cast that we need to consider are casts between
-the \code{Any} type and either a function or a vector
+the \code{Any} type and either a function or a tuple
 type. Figure~\ref{fig:map-any} shows a variant of \code{map!}
 type. Figure~\ref{fig:map-any} shows a variant of \code{map!}
 in which parameter \code{v} does not have a type annotation, so it is
 in which parameter \code{v} does not have a type annotation, so it is
-given type \code{Any}. In the call to \code{map!}, the vector has
+given type \code{Any}. In the call to \code{map!}, the tuple has
 type \code{(Vector Integer Integer)} so the type checker inserts a
 type \code{(Vector Integer Integer)} so the type checker inserts a
 cast from \code{(Vector Integer Integer)} to \code{Any}. A first
 cast from \code{(Vector Integer Integer)} to \code{Any}. A first
 thought is to use \code{Inject}, but that doesn't work because
 thought is to use \code{Inject}, but that doesn't work because
@@ -18860,7 +18869,7 @@ to \code{Any}.
 (let ([v (vector 0 41)])
 (let ([v (vector 0 41)])
   (begin (map! inc v) (vector-ref v 1)))
   (begin (map! inc v) (vector-ref v 1)))
 \end{lstlisting}
 \end{lstlisting}
-\caption{Casting a vector to \code{Any}.}
+\caption{Casting a tuple to \code{Any}.}
 \label{fig:map-any}
 \label{fig:map-any}
 \end{figure}
 \end{figure}
 
 
@@ -18920,14 +18929,14 @@ of the kinds of casts that we've discussed in this section.
 
 
 The interpreter for \LangCast{} is defined in
 The interpreter for \LangCast{} is defined in
 Figure~\ref{fig:interp-Lcast}, with the case for \code{Cast}
 Figure~\ref{fig:interp-Lcast}, with the case for \code{Cast}
-dispatching to \code{apply-cast}. To handle the addition of vector
-proxies, we update the vector primitives in \code{interp-op} using the
-functions in Figure~\ref{fig:guarded-vector}.
+dispatching to \code{apply-cast}. To handle the addition of tuple
+proxies, we update the tuple primitives in \code{interp-op} using the
+functions in Figure~\ref{fig:guarded-tuple}.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 (define interp-Lcast-class
 (define interp-Lcast-class
-  (class interp-Lwhile-class
+  (class interp-Llambda-class
     (super-new)
     (super-new)
     (inherit apply-fun apply-inject apply-project)
     (inherit apply-fun apply-inject apply-project)
 
 
@@ -18988,8 +18997,8 @@ functions in Figure~\ref{fig:guarded-vector}.
          (guarded-vector-length (vector-ref proxy 0))]
          (guarded-vector-length (vector-ref proxy 0))]
         [else (vector-length vec)]))
         [else (vector-length vec)]))
 \end{lstlisting}
 \end{lstlisting}
-\caption{The guarded-vector auxiliary functions.}
-  \label{fig:guarded-vector}
+\caption{The \code{guarded-vector} auxiliary functions.}
+  \label{fig:guarded-tuple}
 \end{figure}
 \end{figure}
 
 
 
 
@@ -18999,7 +19008,7 @@ functions in Figure~\ref{fig:guarded-vector}.
 The next step in the journey towards x86 is the \code{lower-casts}
 The next step in the journey towards x86 is the \code{lower-casts}
 pass that translates the casts in \LangCast{} to the lower-level
 pass that translates the casts in \LangCast{} to the lower-level
 \code{Inject} and \code{Project} operators and a new operator for
 \code{Inject} and \code{Project} operators and a new operator for
-creating vector proxies, extending the \LangLoop{} language to create
+creating tuple proxies, extending the \LangLam{} language to create
 \LangProxy{}. We recommend creating an auxiliary function named
 \LangProxy{}. We recommend creating an auxiliary function named
 \code{lower-cast} that takes an expression (in \LangCast{}), a source type,
 \code{lower-cast} that takes an expression (in \LangCast{}), a source type,
 and a target type, and translates it to expression in \LangProxy{} that has
 and a target type, and translates it to expression in \LangProxy{} that has
@@ -19011,24 +19020,24 @@ the \code{apply-cast} function (Figure~\ref{fig:apply-cast}) used in
 the interpreter for \LangCast{} because it must handle the same cases as
 the interpreter for \LangCast{} because it must handle the same cases as
 \code{apply-cast} and it needs to mimic the behavior of
 \code{apply-cast} and it needs to mimic the behavior of
 \code{apply-cast}. The most interesting cases are those concerning the
 \code{apply-cast}. The most interesting cases are those concerning the
-casts between two vector types and between two function types.
+casts between two tuple types and between two function types.
 
 
-As mentioned in Section~\ref{sec:interp-casts}, a cast from one vector
-type to another vector type is accomplished by creating a proxy that
-intercepts the operations on the underlying vector. Here we make the
+As mentioned in Section~\ref{sec:interp-casts}, a cast from one tuple
+type to another tuple type is accomplished by creating a proxy that
+intercepts the operations on the underlying tuple. Here we make the
 creation of the proxy explicit with the \code{vector-proxy} primitive
 creation of the proxy explicit with the \code{vector-proxy} primitive
 operation. It takes three arguments, the first is an expression for
 operation. It takes three arguments, the first is an expression for
-the vector, the second is a vector of functions for casting an element
-that is being read from the vector, and the third is a vector of
-functions for casting an element that is being written to the vector.
+the tuple, the second is a tuple of functions for casting an element
+that is being read from the tuple, and the third is a tuple of
+functions for casting an element that is being written to the tuple.
 You can create the functions using \code{Lambda}. Also, as we shall
 You can create the functions using \code{Lambda}. Also, as we shall
-see in the next section, we need to differentiate these vectors from
+see in the next section, we need to differentiate these tuples from
 the user-created ones, so we recommend using a new primitive operator
 the user-created ones, so we recommend using a new primitive operator
 named \code{raw-vector} instead of \code{vector} to create these
 named \code{raw-vector} instead of \code{vector} to create these
-vectors of functions. Figure~\ref{fig:map-bang-lower-cast} shows
+tuples of functions. Figure~\ref{fig:map-bang-lower-cast} shows
 the output of \code{lower-casts} on the example in
 the output of \code{lower-casts} on the example in
-Figure~\ref{fig:map-bang} that involved casting a vector of
-integers to a vector of \code{Any}.
+Figure~\ref{fig:map-bang} that involved casting a tuple of
+integers to a tuple of \code{Any}.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}
 \begin{lstlisting}
@@ -19061,14 +19070,14 @@ integers to a vector of \code{Any}.
 A cast from one function type to another function type is accomplished
 A cast from one function type to another function type is accomplished
 by generating a \code{Lambda} whose parameter and return types match
 by generating a \code{Lambda} whose parameter and return types match
 the target function type. The body of the \code{Lambda} should cast
 the target function type. The body of the \code{Lambda} should cast
-the parameters from the target type to the source type (yes,
-backwards! functions are contravariant\index{subject}{contravariant} in the
-parameters), then call the underlying function, and finally cast the
-result from the source return type to the target return type.
+the parameters from the target type to the source type. (Yes,
+backwards! Functions are contravariant\index{subject}{contravariant}
+in the parameters.). Afterwards, call the underlying function and then
+cast the result from the source return type to the target return type.
 Figure~\ref{fig:map-lower-cast} shows the output of the
 Figure~\ref{fig:map-lower-cast} shows the output of the
 \code{lower-casts} pass on the \code{map} example in
 \code{lower-casts} pass on the \code{map} example in
-Figure~\ref{fig:gradual-map}. Note that the \code{inc} argument
-in the call to \code{map} is wrapped in a \code{lambda}.
+Figure~\ref{fig:gradual-map}. Note that the \code{inc} argument in the
+call to \code{map} is wrapped in a \code{lambda}.
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}
 \begin{lstlisting}
@@ -19093,26 +19102,26 @@ in the call to \code{map} is wrapped in a \code{lambda}.
 \section{Differentiate Proxies}
 \section{Differentiate Proxies}
 \label{sec:differentiate-proxies}
 \label{sec:differentiate-proxies}
 
 
-So far the job of differentiating vectors and vector proxies has been
+So far the job of differentiating tuples and tuple proxies has been
 the job of the interpreter. For example, the interpreter for \LangCast{}
 the job of the interpreter. For example, the interpreter for \LangCast{}
 implements \code{vector-ref} using the \code{guarded-vector-ref}
 implements \code{vector-ref} using the \code{guarded-vector-ref}
-function in Figure~\ref{fig:guarded-vector}.  In the
+function in Figure~\ref{fig:guarded-tuple}.  In the
 \code{differentiate-proxies} pass we shift this responsibility to the
 \code{differentiate-proxies} pass we shift this responsibility to the
 generated code.
 generated code.
 
 
-We begin by designing the output language $R^p_8$.  In
-\LangGrad{} we used the type \code{Vector} for both real vectors and vector
-proxies. In $R^p_8$ we return the \code{Vector} type to
-its original meaning, as the type of real vectors, and we introduce a
-new type, \code{PVector}, whose values can be either real vectors or
-vector proxies. This new type comes with a suite of new primitive
-operations for creating and using values of type \code{PVector}. We
-don't need to introduce a new type to represent vector proxies.  A
-proxy is represented by a vector containing three things: 1) the
-underlying vector, 2) a vector of functions for casting elements that
-are read from the vector, and 3) a vector of functions for casting
-values to be written to the vector. So we define the following
-abbreviation for the type of a vector proxy:
+We begin by designing the output language \LangPVec.  In
+\LangGrad{} we used the type \code{Vector} for both real tuples and tuple
+proxies. In \LangPVec we return the \code{Vector} type to
+its original meaning, as the type of real tuples, and we introduce a
+new type, \code{PVector}, whose values can be either real tuples or
+tuple proxies. This new type comes with a suite of new primitive
+operations for creating and using values of type \code{PVector}.
+%We don't need to introduce a new type to represent tuple proxies.
+A proxy is represented by a tuple containing three things: 1) the
+underlying tuple, 2) a tuple of functions for casting elements that
+are read from the tuple, and 3) a tuple of functions for casting
+values to be written to the tuple. So we define the following
+abbreviation for the type of a tuple proxy:
 \[
 \[
 \itm{Proxy} (T\ldots \Rightarrow T'\ldots)
 \itm{Proxy} (T\ldots \Rightarrow T'\ldots)
 = (\ttm{Vector}~(\ttm{PVector}~ T\ldots) ~R~ W)
 = (\ttm{Vector}~(\ttm{PVector}~ T\ldots) ~R~ W)
@@ -19135,37 +19144,36 @@ Next we describe each of the new primitive operations.
 \item[\code{proxy?} : (\key{PVector} $T \ldots$) $\to$
 \item[\code{proxy?} : (\key{PVector} $T \ldots$) $\to$
   \code{Boolean}] \ \\
   \code{Boolean}] \ \\
 %
 %
-  returns true if the value is a vector proxy and false if it is a
-  real vector.
+  This returns true if the value is a tuple proxy and false if it is a
+  real tuple.
 \item[\code{project-vector} : (\key{PVector} $T \ldots$) $\to$
 \item[\code{project-vector} : (\key{PVector} $T \ldots$) $\to$
   (\key{Vector} $T \ldots$)]\ \\
   (\key{Vector} $T \ldots$)]\ \\
 %
 %
-  Assuming that the input is a vector (and not a proxy), this
-  operation returns the vector.
+  Assuming that the input is a tuple, this operation returns the
+  tuple.
   
   
 \item[\code{proxy-vector-length} : (\key{PVector} $T \ldots$)
 \item[\code{proxy-vector-length} : (\key{PVector} $T \ldots$)
   $\to$ \code{Boolean}]\ \\
   $\to$ \code{Boolean}]\ \\
 %
 %
-  Given a vector proxy, this operation returns the length of the
-  underlying vector.
+  Given a tuple proxy, this operation returns the length of the tuple.
   
   
 \item[\code{proxy-vector-ref} : (\key{PVector} $T \ldots$)
 \item[\code{proxy-vector-ref} : (\key{PVector} $T \ldots$)
   $\to$ ($i$ : \code{Integer}) $\to$ $T_i$]\ \\
   $\to$ ($i$ : \code{Integer}) $\to$ $T_i$]\ \\
 %
 %
-  Given a vector proxy, this operation returns the $i$th element of
-  the underlying vector.
+  Given a tuple proxy, this operation returns the $i$th element of the
+  tuple.
   
   
 \item[\code{proxy-vector-set!} : (\key{PVector} $T \ldots$) $\to$ ($i$
 \item[\code{proxy-vector-set!} : (\key{PVector} $T \ldots$) $\to$ ($i$
-  : \code{Integer}) $\to$ $T_i$ $\to$ \key{Void}]\ \\ Given a vector
-  proxy, this operation writes a value to the $i$th element of the
-  underlying vector.
+  : \code{Integer}) $\to$ $T_i$ $\to$ \key{Void}]\ \\
+  Given a tuple proxy, this operation writes a value to the $i$th element
+  of the tuple.
 \end{description}
 \end{description}
 
 
-Now to discuss the translation that differentiates vectors from
-proxies. First, every type annotation in the program must be
-translated (recursively) to replace \code{Vector} with \code{PVector}.
-Next, we must insert uses of \code{PVector} operations in the
-appropriate places. For example, we wrap every vector creation with an
+Now to discuss the translation that differentiates tuples from
+proxies. First, every type annotation in the program is translated
+(recursively) to replace \code{Vector} with \code{PVector}.  Next, we
+insert uses of \code{PVector} operations in the appropriate
+places. For example, we wrap every tuple creation with an
 \code{inject-vector}.
 \code{inject-vector}.
 \begin{lstlisting}
 \begin{lstlisting}
 (vector |$e_1 \ldots e_n$|)
 (vector |$e_1 \ldots e_n$|)
@@ -19187,9 +19195,9 @@ The \code{vector-proxy} primitive translates as follows.
 (inject-proxy (vector |$e'_1~e'_2~e'_3$|))
 (inject-proxy (vector |$e'_1~e'_2~e'_3$|))
 \end{lstlisting}
 \end{lstlisting}
 
 
-We translate the vector operations into conditional expressions that
+We translate the tuple operations into conditional expressions that
 check whether the value is a proxy and then dispatch to either the
 check whether the value is a proxy and then dispatch to either the
-appropriate proxy vector operation or the regular vector operation.
+appropriate proxy tuple operation or the regular tuple operation.
 For example, the following is the translation for \code{vector-ref}.
 For example, the following is the translation for \code{vector-ref}.
 \begin{lstlisting}
 \begin{lstlisting}
 (vector-ref |$e_1$| |$i$|)
 (vector-ref |$e_1$| |$i$|)
@@ -19199,7 +19207,7 @@ For example, the following is the translation for \code{vector-ref}.
     (proxy-vector-ref |$v$| |$i$|)
     (proxy-vector-ref |$v$| |$i$|)
     (vector-ref (project-vector |$v$|) |$i$|)
     (vector-ref (project-vector |$v$|) |$i$|)
 \end{lstlisting}
 \end{lstlisting}
-Note in the case of a real vector, we must apply \code{project-vector}
+Note in the case of a real tuple, we must apply \code{project-vector}
 before the \code{vector-ref}.
 before the \code{vector-ref}.
 
 
 \section{Reveal Casts}
 \section{Reveal Casts}
@@ -19243,10 +19251,10 @@ operations on the \code{PVector} type.
 Recall that the \code{select\_instructions} pass is responsible for
 Recall that the \code{select\_instructions} pass is responsible for
 lowering the primitive operations into x86 instructions.  So we need
 lowering the primitive operations into x86 instructions.  So we need
 to translate the new \code{PVector} operations to x86.  To do so, the
 to translate the new \code{PVector} operations to x86.  To do so, the
-first question we need to answer is how will we differentiate the two
-kinds of values (vectors and proxies) that can inhabit \code{PVector}.
+first question we need to answer is how to differentiate the two
+kinds of values (tuples and proxies) that can inhabit \code{PVector}.
 We need just one bit to accomplish this, and use the bit in position
 We need just one bit to accomplish this, and use the bit in position
-$57$ of the 64-bit tag at the front of every vector (see
+$57$ of the 64-bit tag at the front of every tuple (see
 Figure~\ref{fig:tuple-rep}). So far, this bit has been set to $0$, so
 Figure~\ref{fig:tuple-rep}). So far, this bit has been set to $0$, so
 for \code{inject-vector} we leave it that way.
 for \code{inject-vector} we leave it that way.
 \begin{lstlisting}
 \begin{lstlisting}
@@ -19267,7 +19275,7 @@ movq %r11, |$\itm{lhs'}$|
 
 
 The \code{proxy?} operation consumes the information so carefully
 The \code{proxy?} operation consumes the information so carefully
 stashed away by \code{inject-vector} and \code{inject-proxy}.  It
 stashed away by \code{inject-vector} and \code{inject-proxy}.  It
-isolates the $57$th bit to tell whether the value is a real vector or
+isolates the $57$th bit to tell whether the value is a real tuple or
 a proxy.
 a proxy.
 \begin{lstlisting}
 \begin{lstlisting}
 (Assign |$\itm{lhs}$| (Prim 'proxy? (list e)))
 (Assign |$\itm{lhs}$| (Prim 'proxy? (list e)))
@@ -19284,7 +19292,7 @@ so we leave it up to the reader.
 
 
 Regarding the \code{proxy-vector} operations, the runtime provides
 Regarding the \code{proxy-vector} operations, the runtime provides
 procedures that implement them (they are recursive functions!)  so
 procedures that implement them (they are recursive functions!)  so
-here we simply need to translate these vector operations into the
+here we simply need to translate these tuple operations into the
 appropriate function call. For example, here is the translation for
 appropriate function call. For example, here is the translation for
 \code{proxy-vector-ref}.
 \code{proxy-vector-ref}.
 \begin{lstlisting}
 \begin{lstlisting}
@@ -19296,18 +19304,18 @@ callq proxy_vector_ref
 movq %rax, |$\itm{lhs'}$|
 movq %rax, |$\itm{lhs'}$|
 \end{lstlisting}
 \end{lstlisting}
 
 
-We have another batch of vector operations to deal with, those for the
-\code{Any} type. Recall that the type checker for \LangGrad{} generates an
-\code{any-vector-ref} when there is a \code{vector-ref} on something
-of type \code{Any}, and similarly for \code{any-vector-set!}  and
-\code{any-vector-length} (Figure~\ref{fig:type-check-Rgradual-1}). In
+We have another batch of tuple operations to deal with, those for the
+\code{Any} type. Recall that the type checker for \LangGrad{}
+generates an \code{any-vector-ref} when there is a \code{vector-ref}
+on something of type \code{Any}, and similarly for
+\code{any-vector-set!}  and \code{any-vector-length}
+(Figure~\ref{fig:type-check-Lgradual-1}). In
 Section~\ref{sec:select-Lany} we selected instructions for these
 Section~\ref{sec:select-Lany} we selected instructions for these
 operations based on the idea that the underlying value was a real
 operations based on the idea that the underlying value was a real
-vector. But in the current setting, the underlying value is of type
-\code{PVector}. So \code{any-vector-ref} can be translates to
-pseudo-x86 as follows. We begin by projecting the underlying value out
-of the tagged value and then call the \code{proxy\_vector\_ref}
-procedure in the runtime.
+tuple. But in the current setting, the underlying value is of type
+\code{PVector}. So \code{any-vector-ref} can be translated follows. We
+begin by projecting the underlying value out of the tagged value and
+then call the \code{proxy\_vector\_ref} procedure in the runtime.
 \begin{lstlisting}
 \begin{lstlisting}
 (Assign |$\itm{lhs}$| (Prim 'any-vector-ref (list |$e_1$| |$e_2$|)))
 (Assign |$\itm{lhs}$| (Prim 'any-vector-ref (list |$e_1$| |$e_2$|)))
 movq |$\neg 111$|, %rdi
 movq |$\neg 111$|, %rdi
@@ -19321,9 +19329,9 @@ be translated in a similar way.
 
 
 \begin{exercise}\normalfont\normalsize
 \begin{exercise}\normalfont\normalsize
   Implement a compiler for the gradually-typed \LangGrad{} language by
   Implement a compiler for the gradually-typed \LangGrad{} language by
-  extending and adapting your compiler for \LangLoop{}. Create 10 new
+  extending and adapting your compiler for \LangLam{}. Create 10 new
   partially-typed test programs. In addition to testing with these
   partially-typed test programs. In addition to testing with these
-  new programs, also test your compiler on all the tests for \LangLoop{}
+  new programs, also test your compiler on all the tests for \LangLam{}
   and tests for \LangDyn{}. Sometimes you may get a type checking error
   and tests for \LangDyn{}. Sometimes you may get a type checking error
   on the \LangDyn{} programs but you can adapt them by inserting
   on the \LangDyn{} programs but you can adapt them by inserting
   a cast to the \code{Any} type around each subexpression
   a cast to the \code{Any} type around each subexpression
@@ -19335,19 +19343,20 @@ be translated in a similar way.
 
 
 \begin{figure}[p]
 \begin{figure}[p]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
-\node (Rgradual) at (6,4)  {\large \LangGrad{}};
-\node (Rgradualp) at (3,4)  {\large \LangCast{}};
-\node (Lwhilepp) at (0,4)  {\large \LangProxy{}};
-\node (Lwhileproxy) at (0,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-2) at (3,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-3) at (6,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-4) at (9,2)  {\large \LangPVecFunRef{}};
-\node (Lwhileproxy-5) at (12,2)  {\large \LangPVecFunRef{}};
-\node (F1-1) at (12,0)  {\large \LangPVecFunRef{}};
-\node (F1-2) at (9,0)  {\large \LangPVecFunRef{}};
-\node (F1-3) at (6,0)  {\large \LangPVecFunRef{}};
-\node (F1-4) at (3,0)  {\large \LangPVecAlloc{}};
-\node (F1-5) at (0,0)  {\large \LangPVecAlloc{}};
+\node (Lgradual) at (9,4)  {\large \LangGrad{}};
+\node (Lgradualp) at (6,4)  {\large \LangCast{}};
+\node (Llambdapp) at (3,4)  {\large \LangProxy{}};
+\node (Llambdaproxy) at (0,4)  {\large \LangPVec{}};
+\node (Llambdaproxy-2) at (0,2)  {\large \LangPVec{}};
+\node (Llambdaproxy-3) at (3,2)  {\large \LangPVec{}};
+\node (Llambdaproxy-4) at (6,2)  {\large \LangPVecFunRef{}};
+\node (Llambdaproxy-5) at (9,2)  {\large \LangPVecFunRef{}};
+\node (F1-1) at (12,2)  {\large \LangPVecFunRef{}};
+\node (F1-2) at (12,0)  {\large \LangPVecFunRef{}};
+\node (F1-3) at (9,0)  {\large \LangPVecFunRef{}};
+\node (F1-4) at (6,0)  {\large \LangPVecAlloc{}};
+\node (F1-5) at (3,0)  {\large \LangPVecAlloc{}};
+\node (F1-6) at (0,0)  {\large \LangPVecAlloc{}};
 \node (C3-2) at (3,-2)  {\large \LangCLoopPVec{}};
 \node (C3-2) at (3,-2)  {\large \LangCLoopPVec{}};
 
 
 \node (x86-2) at (3,-4)  {\large \LangXIndCallVar{}};
 \node (x86-2) at (3,-4)  {\large \LangXIndCallVar{}};
@@ -19358,31 +19367,33 @@ be translated in a similar way.
 \node (x86-5) at (9,-6) {\large \LangXIndCall{}};
 \node (x86-5) at (9,-6) {\large \LangXIndCall{}};
 
 
 
 
-\path[->,bend right=15] (Rgradual) edge [above] node
-     {\ttfamily\footnotesize type\_check} (Rgradualp);
-\path[->,bend right=15] (Rgradualp) edge [above] node
-     {\ttfamily\footnotesize lower\_casts} (Lwhilepp);
-\path[->,bend right=15] (Lwhilepp) edge [right] node
-     {\ttfamily\footnotesize differentiate\_proxies} (Lwhileproxy);
-\path[->,bend left=15] (Lwhileproxy) edge [above] node
-     {\ttfamily\footnotesize shrink} (Lwhileproxy-2);
-\path[->,bend left=15] (Lwhileproxy-2) edge [above] node
-     {\ttfamily\footnotesize uniquify} (Lwhileproxy-3);
-\path[->,bend left=15] (Lwhileproxy-3) edge [above] node
-     {\ttfamily\footnotesize reveal\_functions} (Lwhileproxy-4);
-\path[->,bend left=15] (Lwhileproxy-4) edge [above] node
-     {\ttfamily\footnotesize reveal\_casts} (Lwhileproxy-5);
-\path[->,bend left=15] (Lwhileproxy-5) edge [left] node
+\path[->,bend right=15] (Lgradual) edge [above] node
+     {\ttfamily\footnotesize type\_check} (Lgradualp);
+\path[->,bend right=15] (Lgradualp) edge [above] node
+     {\ttfamily\footnotesize lower\_casts} (Llambdapp);
+\path[->,bend right=15] (Llambdapp) edge [above] node
+     {\ttfamily\footnotesize differentiate.} (Llambdaproxy);
+\path[->,bend left=15] (Llambdaproxy) edge [right] node
+     {\ttfamily\footnotesize shrink} (Llambdaproxy-2);
+\path[->,bend left=15] (Llambdaproxy-2) edge [above] node
+     {\ttfamily\footnotesize uniquify} (Llambdaproxy-3);
+\path[->,bend left=15] (Llambdaproxy-3) edge [above] node
+     {\ttfamily\footnotesize reveal\_functions} (Llambdaproxy-4);
+\path[->,bend left=15] (Llambdaproxy-4) edge [above] node
+     {\ttfamily\footnotesize reveal\_casts} (Llambdaproxy-5);
+\path[->,bend left=15] (Llambdaproxy-5) edge [above] node
      {\ttfamily\footnotesize convert\_assignments} (F1-1);
      {\ttfamily\footnotesize convert\_assignments} (F1-1);
-\path[->,bend left=15] (F1-1) edge [below] node
+\path[->,bend left=15] (F1-1) edge [left] node
      {\ttfamily\footnotesize convert\_to\_clos.} (F1-2);
      {\ttfamily\footnotesize convert\_to\_clos.} (F1-2);
-\path[->,bend right=15] (F1-2) edge [above] node
+\path[->,bend left=15] (F1-2) edge [below] node
      {\ttfamily\footnotesize limit\_fun.} (F1-3);
      {\ttfamily\footnotesize limit\_fun.} (F1-3);
 \path[->,bend right=15] (F1-3) edge [above] node
 \path[->,bend right=15] (F1-3) edge [above] node
      {\ttfamily\footnotesize expose\_alloc.} (F1-4);
      {\ttfamily\footnotesize expose\_alloc.} (F1-4);
 \path[->,bend right=15] (F1-4) edge [above] node
 \path[->,bend right=15] (F1-4) edge [above] node
-     {\ttfamily\footnotesize remove\_complex.} (F1-5);
-\path[->,bend right=15] (F1-5) edge [right] node
+     {\ttfamily\footnotesize uncover\_get!} (F1-5);
+\path[->,bend right=15] (F1-5) edge [above] node
+     {\ttfamily\footnotesize remove\_complex.} (F1-6);
+\path[->,bend right=15] (F1-6) edge [right] node
      {\ttfamily\footnotesize explicate\_control} (C3-2);
      {\ttfamily\footnotesize explicate\_control} (C3-2);
 \path[->,bend left=15] (C3-2) edge [left] node
 \path[->,bend left=15] (C3-2) edge [left] node
      {\ttfamily\footnotesize select\_instr.} (x86-2);
      {\ttfamily\footnotesize select\_instr.} (x86-2);
@@ -19394,14 +19405,14 @@ be translated in a similar way.
      {\ttfamily\footnotesize allocate\_reg.} (x86-3);
      {\ttfamily\footnotesize allocate\_reg.} (x86-3);
 \path[->,bend left=15] (x86-3) edge [above] node
 \path[->,bend left=15] (x86-3) edge [above] node
      {\ttfamily\footnotesize patch\_instr.} (x86-4);
      {\ttfamily\footnotesize patch\_instr.} (x86-4);
-\path[->,bend left=15] (x86-4) edge [right] node {\ttfamily\footnotesize print-x86} (x86-5);
+\path[->,bend left=15] (x86-4) edge [right] node {\ttfamily\footnotesize prelude\_and\_conc.} (x86-5);
 \end{tikzpicture}
 \end{tikzpicture}
   \caption{Diagram of the passes for \LangGrad{} (gradual typing).}
   \caption{Diagram of the passes for \LangGrad{} (gradual typing).}
-\label{fig:Rgradual-passes}
+\label{fig:Lgradual-passes}
 \end{figure}
 \end{figure}
 
 
-Figure~\ref{fig:Rgradual-passes} provides an overview of all the passes needed
-for the compilation of \LangGrad{}.
+Figure~\ref{fig:Lgradual-passes} provides an overview of the passes
+needed for the compilation of \LangGrad{}.
 
 
 \section{Further Reading}
 \section{Further Reading}
 
 
@@ -19419,13 +19430,13 @@ original location of the cast in the source program.
 
 
 The problem addressed by space-efficient casts also relates to
 The problem addressed by space-efficient casts also relates to
 higher-order casts. It turns out that in partially typed programs, a
 higher-order casts. It turns out that in partially typed programs, a
-function or vector can flow through very-many casts at runtime. With
+function or tuple can flow through very-many casts at runtime. With
 the approach described in this chapter, each cast adds another
 the approach described in this chapter, each cast adds another
-\code{lambda} wrapper or a vector proxy. Not only does this take up
-considerable space, but it also makes the function calls and vector
+\code{lambda} wrapper or a tuple proxy. Not only does this take up
+considerable space, but it also makes the function calls and tuple
 operations slow.  For example, a partially-typed version of quicksort
 operations slow.  For example, a partially-typed version of quicksort
 could, in the worst case, build a chain of proxies of length $O(n)$
 could, in the worst case, build a chain of proxies of length $O(n)$
-around the vector, changing the overall time complexity of the
+around the tuple, changing the overall time complexity of the
 algorithm from $O(n^2)$ to $O(n^3)$! \citet{Herman:2006uq} suggested a
 algorithm from $O(n^2)$ to $O(n^3)$! \citet{Herman:2006uq} suggested a
 solution to this problem by representing casts using the coercion
 solution to this problem by representing casts using the coercion
 calculus of \citet{Henglein:1994nz}, which prevents the creation of
 calculus of \citet{Henglein:1994nz}, which prevents the creation of
@@ -19473,7 +19484,7 @@ parameterizing functions and data structures with respect to the types
 that they operate on. For example, Figure~\ref{fig:map-poly}
 that they operate on. For example, Figure~\ref{fig:map-poly}
 revisits the \code{map} example but this time gives it a more
 revisits the \code{map} example but this time gives it a more
 fitting type.  This \code{map} function is parameterized with
 fitting type.  This \code{map} function is parameterized with
-respect to the element type of the vector. The type of \code{map}
+respect to the element type of the tuple. The type of \code{map}
 is the following polymorphic type as specified by the \code{All} and
 is the following polymorphic type as specified by the \code{All} and
 the type parameter \code{a}.
 the type parameter \code{a}.
 \begin{lstlisting}
 \begin{lstlisting}
@@ -19481,9 +19492,9 @@ the type parameter \code{a}.
 \end{lstlisting}
 \end{lstlisting}
 The idea is that \code{map} can be used at \emph{all} choices of a
 The idea is that \code{map} can be used at \emph{all} choices of a
 type for parameter \code{a}. In Figure~\ref{fig:map-poly} we apply
 type for parameter \code{a}. In Figure~\ref{fig:map-poly} we apply
-\code{map} to a vector of integers, a choice of \code{Integer} for
+\code{map} to a tuple of integers, a choice of \code{Integer} for
 \code{a}, but we could have just as well applied \code{map} to a
 \code{a}, but we could have just as well applied \code{map} to a
-vector of Booleans (and a function on Booleans).
+tuple of Booleans (and a function on Booleans).
 
 
 \begin{figure}[tbp]
 \begin{figure}[tbp]
   % poly_test_2.rkt
   % poly_test_2.rkt
@@ -19528,8 +19539,8 @@ polymorphic types and type variables.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The concrete syntax of \LangPoly{}, extending \LangLoop{}
-    (Figure~\ref{fig:Lwhile-concrete-syntax}).}
+\caption{The concrete syntax of \LangPoly{}, extending \LangLam{}
+    (Figure~\ref{fig:Llambda-concrete-syntax}).}
 \label{fig:Rpoly-concrete-syntax}
 \label{fig:Rpoly-concrete-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -19549,8 +19560,8 @@ polymorphic types and type variables.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The abstract syntax of \LangPoly{}, extending \LangLoop{}
-    (Figure~\ref{fig:Lwhile-syntax}).}
+\caption{The abstract syntax of \LangPoly{}, extending \LangLam{}
+    (Figure~\ref{fig:Llambda-syntax}).}
 \label{fig:Rpoly-syntax}
 \label{fig:Rpoly-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -19583,7 +19594,7 @@ applies the polymorphic function to a Boolean and to an integer.
 \end{figure}
 \end{figure}
 
 
 The type checker for \LangPoly{} in Figure~\ref{fig:type-check-Lvar0} has
 The type checker for \LangPoly{} in Figure~\ref{fig:type-check-Lvar0} has
-three new responsibilities (compared to \LangLoop{}). The type checking of
+three new responsibilities (compared to \LangLam{}). The type checking of
 function application is extended to handle the case where the operator
 function application is extended to handle the case where the operator
 expression is a polymorphic function. In that case the type arguments
 expression is a polymorphic function. In that case the type arguments
 are deduced by matching the type of the parameters with the types of
 are deduced by matching the type of the parameters with the types of
@@ -19610,7 +19621,7 @@ deduced type arguments, using the \code{subst-type} function.
 The second responsibility of the type checker is extending the
 The second responsibility of the type checker is extending the
 function \code{type-equal?} to handle the \code{All} type.  This is
 function \code{type-equal?} to handle the \code{All} type.  This is
 not quite a simple as equal on other types, such as function and
 not quite a simple as equal on other types, such as function and
-vector types, because two polymorphic types can be syntactically
+tuple types, because two polymorphic types can be syntactically
 different even though they are equivalent types. For example,
 different even though they are equivalent types. For example,
 \code{(All (a) (a -> a))} is equivalent to \code{(All (b) (b -> b))}.
 \code{(All (a) (a -> a))} is equivalent to \code{(All (b) (b -> b))}.
 Two polymorphic types should be considered equal if they differ only
 Two polymorphic types should be considered equal if they differ only
@@ -19647,8 +19658,8 @@ process in next pass of the compiler.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The abstract syntax of \LangInst{}, extending \LangLoop{}
-    (Figure~\ref{fig:Lwhile-syntax}).}
+\caption{The abstract syntax of \LangInst{}, extending \LangLam{}
+    (Figure~\ref{fig:Llambda-syntax}).}
 \label{fig:Rpoly-prime-syntax}
 \label{fig:Rpoly-prime-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -19674,7 +19685,7 @@ example is listed in Figure~\ref{fig:map-type-check}.
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
 (define type-check-poly-class
 (define type-check-poly-class
-  (class type-check-Lwhile-class
+  (class type-check-Llambda-class
     (super-new)
     (super-new)
     (inherit check-type-equal?)
     (inherit check-type-equal?)
   
   
@@ -19876,7 +19887,7 @@ polymorphism, which we describe below.
   
   
 \item[Mixed representation] generates one version of each polymorphic
 \item[Mixed representation] generates one version of each polymorphic
   function, using a boxed representation for type
   function, using a boxed representation for type
-  variables. Monomorphic code is compiled as usual (as in \LangLoop{})
+  variables. Monomorphic code is compiled as usual (as in \LangLam{})
   and conversions are performed at the boundaries between monomorphic
   and conversions are performed at the boundaries between monomorphic
   and polymorphic (e.g. when a polymorphic function is instantiated
   and polymorphic (e.g. when a polymorphic function is instantiated
   and called). This approach is compatible with separate compilation
   and called). This approach is compatible with separate compilation
@@ -20014,13 +20025,13 @@ annotations and the body.
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \begin{tikzpicture}[baseline=(current  bounding  box.center)]
 \node (Rpoly) at (9,4)  {\large \LangPoly{}};
 \node (Rpoly) at (9,4)  {\large \LangPoly{}};
 \node (Rpolyp) at (6,4)  {\large \LangInst{}};
 \node (Rpolyp) at (6,4)  {\large \LangInst{}};
-\node (Rgradualp) at (3,4)  {\large \LangCast{}};
-\node (Lwhilepp) at (0,4)  {\large \LangProxy{}};
-\node (Lwhileproxy) at (0,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-2) at (3,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-3) at (6,2)  {\large \LangPVec{}};
-\node (Lwhileproxy-4) at (9,2)  {\large \LangPVecFunRef{}};
-\node (Lwhileproxy-5) at (12,2)  {\large \LangPVecFunRef{}};
+\node (Lgradualp) at (3,4)  {\large \LangCast{}};
+\node (Llambdapp) at (0,4)  {\large \LangProxy{}};
+\node (Llambdaproxy) at (0,2)  {\large \LangPVec{}};
+\node (Llambdaproxy-2) at (3,2)  {\large \LangPVec{}};
+\node (Llambdaproxy-3) at (6,2)  {\large \LangPVec{}};
+\node (Llambdaproxy-4) at (9,2)  {\large \LangPVecFunRef{}};
+\node (Llambdaproxy-5) at (12,2)  {\large \LangPVecFunRef{}};
 \node (F1-1) at (12,0)  {\large \LangPVecFunRef{}};
 \node (F1-1) at (12,0)  {\large \LangPVecFunRef{}};
 \node (F1-2) at (9,0)  {\large \LangPVecFunRef{}};
 \node (F1-2) at (9,0)  {\large \LangPVecFunRef{}};
 \node (F1-3) at (6,0)  {\large \LangPVecFunRef{}};
 \node (F1-3) at (6,0)  {\large \LangPVecFunRef{}};
@@ -20039,20 +20050,20 @@ annotations and the body.
 \path[->,bend right=15] (Rpoly) edge [above] node
 \path[->,bend right=15] (Rpoly) edge [above] node
      {\ttfamily\footnotesize type\_check} (Rpolyp);
      {\ttfamily\footnotesize type\_check} (Rpolyp);
 \path[->,bend right=15] (Rpolyp) edge [above] node
 \path[->,bend right=15] (Rpolyp) edge [above] node
-     {\ttfamily\footnotesize erase\_types} (Rgradualp);
-\path[->,bend right=15] (Rgradualp) edge [above] node
-     {\ttfamily\footnotesize lower\_casts} (Lwhilepp);
-\path[->,bend right=15] (Lwhilepp) edge [right] node
-     {\ttfamily\footnotesize differentiate\_proxies} (Lwhileproxy);
-\path[->,bend left=15] (Lwhileproxy) edge [above] node
-     {\ttfamily\footnotesize shrink} (Lwhileproxy-2);
-\path[->,bend left=15] (Lwhileproxy-2) edge [above] node
-     {\ttfamily\footnotesize uniquify} (Lwhileproxy-3);
-\path[->,bend left=15] (Lwhileproxy-3) edge [above] node
-     {\ttfamily\footnotesize reveal\_functions} (Lwhileproxy-4);
-\path[->,bend left=15] (Lwhileproxy-4) edge [above] node
-     {\ttfamily\footnotesize reveal\_casts} (Lwhileproxy-5);
-\path[->,bend left=15] (Lwhileproxy-5) edge [left] node
+     {\ttfamily\footnotesize erase\_types} (Lgradualp);
+\path[->,bend right=15] (Lgradualp) edge [above] node
+     {\ttfamily\footnotesize lower\_casts} (Llambdapp);
+\path[->,bend right=15] (Llambdapp) edge [right] node
+     {\ttfamily\footnotesize differentiate\_proxies} (Llambdaproxy);
+\path[->,bend left=15] (Llambdaproxy) edge [above] node
+     {\ttfamily\footnotesize shrink} (Llambdaproxy-2);
+\path[->,bend left=15] (Llambdaproxy-2) edge [above] node
+     {\ttfamily\footnotesize uniquify} (Llambdaproxy-3);
+\path[->,bend left=15] (Llambdaproxy-3) edge [above] node
+     {\ttfamily\footnotesize reveal\_functions} (Llambdaproxy-4);
+\path[->,bend left=15] (Llambdaproxy-4) edge [above] node
+     {\ttfamily\footnotesize reveal\_casts} (Llambdaproxy-5);
+\path[->,bend left=15] (Llambdaproxy-5) edge [left] node
      {\ttfamily\footnotesize convert\_assignments} (F1-1);
      {\ttfamily\footnotesize convert\_assignments} (F1-1);
 \path[->,bend left=15] (F1-1) edge [below] node
 \path[->,bend left=15] (F1-1) edge [below] node
      {\ttfamily\footnotesize convert\_to\_clos.} (F1-2);
      {\ttfamily\footnotesize convert\_to\_clos.} (F1-2);

+ 3 - 3
defs.tex

@@ -67,9 +67,9 @@
 \newcommand{\LangArray}{\ensuremath{\Lang^{\mathsf{Array}}_{\mathsf{While}}}} %\Lang^s3
 \newcommand{\LangArray}{\ensuremath{\Lang^{\mathsf{Array}}_{\mathsf{While}}}} %\Lang^s3
 \newcommand{\LangGrad}{$\Lang_{\mathsf{?}}$} %R9
 \newcommand{\LangGrad}{$\Lang_{\mathsf{?}}$} %R9
 \newcommand{\LangGradM}{\Lang_{\mathsf{?}}} %R9
 \newcommand{\LangGradM}{\Lang_{\mathsf{?}}} %R9
-\newcommand{\LangCast}{$\Lang_{\mathsf{cast}}$} %R9'
-\newcommand{\LangCastM}{\Lang_{\mathsf{cast}}} %R9'
-\newcommand{\LangProxy}{\ensuremath{\Lang_{\mathsf{proxy}}}} %R8''
+\newcommand{\LangCast}{$\Lang_{\mathsf{Cast}}$} %R9'
+\newcommand{\LangCastM}{\Lang_{\mathsf{Cast}}} %R9'
+\newcommand{\LangProxy}{\ensuremath{\Lang_{\mathsf{Proxy}}}} %R8''
 \newcommand{\LangPVec}{\ensuremath{\Lang_{\mathsf{PVec}}}} %R8''
 \newcommand{\LangPVec}{\ensuremath{\Lang_{\mathsf{PVec}}}} %R8''
 \newcommand{\LangPVecFunRef}{\ensuremath{\Lang^{\mathsf{FunRef}}_{\mathsf{PVec}}}} %R8''
 \newcommand{\LangPVecFunRef}{\ensuremath{\Lang^{\mathsf{FunRef}}_{\mathsf{PVec}}}} %R8''
 \newcommand{\LangPVecAlloc}{\ensuremath{\Lang^{\mathsf{Alloc}}_{\mathsf{PVec}}}} %R8''
 \newcommand{\LangPVecAlloc}{\ensuremath{\Lang^{\mathsf{Alloc}}_{\mathsf{PVec}}}} %R8''