浏览代码

more refactoring

Jeremy Siek 3 年之前
父节点
当前提交
ed6a046104
共有 1 个文件被更改,包括 139 次插入81 次删除
  1. 139 81
      book.tex

+ 139 - 81
book.tex

@@ -1,5 +1,8 @@
 \documentclass[7x10]{TimesAPriori_MIT}%%7x10
 
+% TODO:
+% move binary subtraction from Lif to Lint
+
 \usepackage[utf8]{inputenc}
 %% \usepackage{setspace}
 %% \doublespacing
@@ -884,11 +887,13 @@ defined in Figure~\ref{fig:r0-concrete-syntax}.
 
 \newcommand{\LintGrammar}{
   \begin{array}{rcl}
+    \Type &::=& \key{Integer} \\
     \Exp{} &::=& \Int{} \MID \LP\key{read}\RP \MID \LP\key{-}\;\Exp\RP \MID \LP\key{+} \; \Exp{}\;\Exp{}\RP
   \end{array}
 }
 \newcommand{\LintAST}{
   \begin{array}{rcl}
+    \Type &::=& \key{Integer} \\
     \Exp{} &::=& \INT{\Int} \MID \READ{} \\
            &\MID& \NEG{\Exp} \MID \ADD{\Exp}{\Exp}
   \end{array}
@@ -1720,7 +1725,7 @@ exhibit several compilation techniques.
 {\if\edition\racketEd
 \[
 \begin{array}{l}
-   \gray{\LintGrammar{}} \\
+   \gray{\LintGrammar{}} \\ \hline
    \LvarGrammar{}  \\
   \begin{array}{rcl}
     \LangVarM{} &::=& \Exp
@@ -1750,7 +1755,7 @@ exhibit several compilation techniques.
 {\if\edition\racketEd
 \[
 \begin{array}{l}
-  \gray{\LintAST{}} \\
+  \gray{\LintAST{}} \\ \hline
   \LvarAST \\
   \begin{array}{rcl}
     \LangVarM{} &::=& \PROGRAM{\code{'()}}{\Exp}
@@ -6468,6 +6473,7 @@ operators to include
 
 \newcommand{\LifGrammar}{
   \begin{array}{lcl}
+   \Type &::=& \key{Boolean} \\
     \itm{bool} &::=& \TRUE \MID \FALSE \\  
     \itm{cmp} &::= & \key{eq?} \MID \key{<} \MID \key{<=} \MID \key{>} \MID \key{>=} \\
     \Exp &::=& \CSUB{\Exp}{\Exp} \MID \itm{bool}
@@ -6478,17 +6484,17 @@ operators to include
 }
 \newcommand{\LifAST}{
 \begin{array}{lcl}
+   \Type &::=& \key{Boolean} \\
   \itm{bool} &::=& \code{\#t} \MID \code{\#f} \\
   \itm{cmp} &::= & \code{eq?} \MID \code{<} \MID \code{<=} \MID \code{>} \MID \code{>=} \\
-  \itm{op} &::= & \itm{cmp} \MID \code{read} \MID \code{+} \MID \code{-}
-    \MID \code{and} \MID \code{or} \MID \code{not} \\
-  \Exp &::=& \PRIM{\itm{op}}{\Exp\ldots}
-       \MID \BOOL{\itm{bool}} \MID \IF{\Exp}{\Exp}{\Exp} \\
+  \itm{op} &::= & \itm{cmp} \MID \code{and} \MID \code{or} \MID \code{not} \\
+  \Exp &::=& \BOOL{\itm{bool}} \MID \IF{\Exp}{\Exp}{\Exp} 
 \end{array}
 }
 \newcommand{\LintOnlyAST}{
   \begin{array}{rcl}
-    \Exp{} &::=& \INT{\Int} 
+    \itm{op} &::= & \code{read} \MID \code{+} \MID \code{-}\\
+    \Exp{} &::=& \INT{\Int} \MID \PRIM{\itm{op}}{\Exp\ldots}    
   \end{array}
 }
 
@@ -6499,9 +6505,9 @@ operators to include
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \LifGrammar{} \\
-  \gray{\LintGrammar{}} \\
-  \gray{\LvarGrammar{}} \\
+  \gray{\LintGrammar{}} \\ \hline
+  \gray{\LvarGrammar{}} \\ \hline
+  \LifGrammar{} \\ 
   \begin{array}{lcl}
     \LangIfM{} &::=& \Exp
   \end{array}
@@ -6535,9 +6541,9 @@ operators to include
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \LifAST{} \\
-  \gray{\LintOnlyAST} \\
-  \gray{\LvarAST{}} \\
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \LifAST{} \\ 
   \begin{array}{lcl}
     \LangIfM{} &::=& \PROGRAM{\code{'()}}{\Exp}
   \end{array}
@@ -9455,6 +9461,7 @@ the condition remains true.
 
 \newcommand{\LwhileGrammar}{
   \begin{array}{lcl}
+   \Type &::=& \key{Void}\\
    \Exp &::=& \CSETBANG{\Var}{\Exp}
       \MID \CBEGIN{\Exp\ldots}{\Exp}
       \MID \CWHILE{\Exp}{\Exp} \MID \LP\key{void}\RP 
@@ -9462,6 +9469,7 @@ the condition remains true.
 }
 \newcommand{\LwhileAST}{
 \begin{array}{lcl}
+  \Type &::=& \key{Void}\\
   \Exp &::=& \SETBANG{\Var}{\Exp} \MID \BEGIN{\LP\Exp\ldots\RP}{\Exp}\\
     &\MID& \WHILE{\Exp}{\Exp} \MID \VOID{}  
 \end{array}
@@ -9475,9 +9483,9 @@ the condition remains true.
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \gray{\LifGrammar{}} \\
-  \gray{\LintGrammar{}} \\
-  \gray{\LvarGrammar{}} \\
+  \gray{\LintGrammar{}} \\ \hline
+  \gray{\LvarGrammar{}} \\ \hline
+  \gray{\LifGrammar{}} \\ \hline
   \LwhileGrammar \\
   \begin{array}{lcl}
   \LangLoopM{} &::=& \Exp
@@ -9513,9 +9521,9 @@ the condition remains true.
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \gray{\LifAST{}} \\
-  \gray{\LintOnlyAST} \\
-  \gray{\LvarAST{}} \\
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \gray{\LifAST{}} \\ \hline
   \LwhileAST{} \\
 \begin{array}{lcl}
   %% \Exp &::=& \gray{ \INT{\Int} \VAR{\Var} \MID \LET{\Var}{\Exp}{\Exp} } \\
@@ -10591,8 +10599,7 @@ print( t[0] + t[2][0] if t[1] else 44 )
 
 \newcommand{\LtupGrammar}{
 \begin{array}{lcl}
-  \Type &::=& \key{Integer} \MID \key{Boolean} \MID \key{Void}
-   \MID \LP\key{Vector}\;\Type\ldots\RP \\
+  \Type &::=& \LP\key{Vector}\;\Type\ldots\RP \\
   \Exp &::=& \LP\key{vector}\;\Exp\ldots\RP 
    \MID \LP\key{vector-length}\;\Exp\RP \\
   &\MID& \LP\key{vector-ref}\;\Exp\;\Int\RP
@@ -10601,8 +10608,7 @@ print( t[0] + t[2][0] if t[1] else 44 )
 }
 \newcommand{\LtupAST}{
 \begin{array}{lcl}
- \Type &::=& \key{Integer} \MID \key{Boolean} \MID \key{Void}
-      \MID \LP\key{Vector}\;\Type\ldots\RP \\
+ \Type &::=& \LP\key{Vector}\;\Type\ldots\RP \\
 \itm{op} &::=& \code{vector} \MID \code{vector-length} \\
 \Exp &::=& \VECREF{\Exp}{\INT{\Int}} \\
      &\MID& \VECSET{\Exp}{\INT{\Int}}{\Exp} \\
@@ -10617,10 +10623,10 @@ print( t[0] + t[2][0] if t[1] else 44 )
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \gray{\LifGrammar{}} \\
-  \gray{\LintGrammar{}} \\
-  \gray{\LvarGrammar{}} \\
-  \gray{\LwhileGrammar} \\
+  \gray{\LintGrammar{}} \\ \hline
+  \gray{\LvarGrammar{}} \\ \hline
+  \gray{\LifGrammar{}} \\ \hline
+  \gray{\LwhileGrammar} \\ \hline
   \LtupGrammar \\  
   \begin{array}{lcl}
   %% \Type &::=& \gray{\key{Integer} \MID \key{Boolean}}
@@ -10675,10 +10681,10 @@ print( t[0] + t[2][0] if t[1] else 44 )
 {\if\edition\racketEd    
 \[
 \begin{array}{l}
-  \gray{\LifAST{}} \\
-  \gray{\LintOnlyAST} \\
-  \gray{\LvarAST{}} \\
-  \gray{\LwhileAST{}} \\
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \gray{\LifAST{}} \\ \hline
+  \gray{\LwhileAST{}} \\ \hline
   \LtupAST{} \\
 \begin{array}{lcl}
 %% \Exp &::=& \gray{ \INT{\Int} \MID \VAR{\Var} \MID \LET{\Var}{\Exp}{\Exp} } \\
@@ -12700,11 +12706,11 @@ inside each other.
     \small
 \[
 \begin{array}{l}
-  \gray{\LifGrammar{}} \\
-  \gray{\LintGrammar{}} \\
-  \gray{\LvarGrammar{}} \\
-  \gray{\LwhileGrammar} \\
-  \gray{\LtupGrammar} \\  
+  \gray{\LintGrammar{}} \\ \hline
+  \gray{\LvarGrammar{}} \\ \hline
+  \gray{\LifGrammar{}} \\ \hline
+  \gray{\LwhileGrammar} \\ \hline
+  \gray{\LtupGrammar} \\   \hline
   \LfunGrammar \\  
   \begin{array}{lcl}
 %%   \Type &::=& \gray{ \key{Integer} \MID \key{Boolean}
@@ -12740,11 +12746,11 @@ inside each other.
     \small
 \[
 \begin{array}{l}
-  \gray{\LifAST{}} \\
-  \gray{\LintOnlyAST} \\
-  \gray{\LvarAST{}} \\
-  \gray{\LwhileAST{}} \\
-  \gray{\LtupAST{}} \\
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \gray{\LifAST{}} \\ \hline
+  \gray{\LwhileAST{}} \\ \hline
+  \gray{\LtupAST{}} \\ \hline
   \LfunAST \\
   \begin{array}{lcl}
 %% \Exp &::=& \gray{ \INT{\Int} \MID \VAR{\Var} \MID \LET{\Var}{\Exp}{\Exp} } \\
@@ -13974,32 +13980,54 @@ Figures~\ref{fig:Rlam-concrete-syntax} and ~\ref{fig:Rlam-syntax}. It adds
 the \key{lambda} form to the grammar for \LangFun{}, which already has
 syntax for function application.
 
+\newcommand{\LlambdaGrammar}{
+  \begin{array}{lcl}
+  \Exp &::=& \LP \key{procedure-arity}~\Exp\RP \\
+    &\MID& \CLAMBDA{\LP\LS\Var \key{:} \Type\RS\ldots\RP}{\Type}{\Exp} 
+  \end{array}
+}
+\newcommand{\LlambdaAST}{
+  \begin{array}{lcl}
+  \itm{op} &::=& \code{procedure-arity} \\
+  \Exp &::=& \LAMBDA{\LP\LS\Var\code{:}\Type\RS\ldots\RP}{\Type}{\Exp}
+  \end{array}
+}
+
 \begin{figure}[tp]
 \centering
 \fbox{
   \begin{minipage}{0.96\textwidth}
     \small
 \[
-\begin{array}{lcl}
-  \Type &::=& \gray{\key{Integer} \MID \key{Boolean}
-     \MID (\key{Vector}\;\Type\ldots) \MID \key{Void}
-     \MID (\Type\ldots \; \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& \LP \key{procedure-arity}~\Exp\RP \\
-    &\MID& \CLAMBDA{\LP\LS\Var \key{:} \Type\RS\ldots\RP}{\Type}{\Exp} \\
-  \Def &::=& \gray{ \CDEF{\Var}{\LS\Var \key{:} \Type\RS\ldots}{\Type}{\Exp} } \\
-  \LangLamM{} &::=& \gray{\Def\ldots \; \Exp}
+\begin{array}{l}
+  \gray{\LintGrammar{}} \\ \hline
+  \gray{\LvarGrammar{}} \\ \hline
+  \gray{\LifGrammar{}} \\ \hline
+  \gray{\LwhileGrammar} \\ \hline
+  \gray{\LtupGrammar} \\   \hline
+  \gray{\LfunGrammar} \\   \hline
+  \LlambdaGrammar \\
+  \begin{array}{lcl}
+  %% \Type &::=& \gray{\key{Integer} \MID \key{Boolean}
+  %%    \MID (\key{Vector}\;\Type\ldots) \MID \key{Void}
+  %%    \MID (\Type\ldots \; \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& \LP \key{procedure-arity}~\Exp\RP \\
+  %%   &\MID& \CLAMBDA{\LP\LS\Var \key{:} \Type\RS\ldots\RP}{\Type}{\Exp} \\
+  %% \Def &::=& \gray{ \CDEF{\Var}{\LS\Var \key{:} \Type\RS\ldots}{\Type}{\Exp} } \\
+  \LangLamM{} &::=& \Def\ldots \; \Exp
+  \end{array}
 \end{array}
 \]
 \end{minipage}
@@ -14015,17 +14043,26 @@ syntax for function application.
   \begin{minipage}{0.96\textwidth}
     \small
 \[
-\begin{array}{lcl}
-  \itm{op} &::=& \ldots \MID \code{procedure-arity} \\
-  \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\LS\Var\code{:}\Type\RS\ldots\RP}{\Type}{\Exp}\\
- \Def &::=& \gray{ \FUNDEF{\Var}{\LP\LS\Var \code{:} \Type\RS\ldots\RP}{\Type}{\code{'()}}{\Exp} }\\
+\begin{array}{l}
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \gray{\LifAST{}} \\ \hline
+  \gray{\LwhileAST{}} \\ \hline
+  \gray{\LtupAST{}} \\ \hline
+  \gray{\LfunAST} \\ \hline
+  \LlambdaAST \\
+  \begin{array}{lcl}
+ %%  \itm{op} &::=& \ldots \MID \code{procedure-arity} \\
+ %%  \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\LS\Var\code{:}\Type\RS\ldots\RP}{\Type}{\Exp}\\
+ %% \Def &::=& \gray{ \FUNDEF{\Var}{\LP\LS\Var \code{:} \Type\RS\ldots\RP}{\Type}{\code{'()}}{\Exp} }\\
   \LangLamM{} &::=& \gray{ \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp} }
+  \end{array}
 \end{array}
 \]
 \end{minipage}
@@ -15097,23 +15134,44 @@ in greater detail.
 \section{The \LangAny{} Language}
 \label{sec:Rany-lang}
 
+\newcommand{\LAnyAST}{
+\begin{array}{lcl}
+\Type &::= & \key{Any} \\
+\itm{op} &::= & \code{any-vector-length}
+     \MID \code{any-vector-ref} \MID \code{any-vector-set!}\\
+    &\MID& \code{boolean?} \MID \code{integer?} \MID \code{vector?}
+     \MID \code{procedure?} \MID \code{void?} \\
+  \Exp &::=& \INJECT{\Exp}{\FType} \MID \PROJECT{\Exp}{\FType} 
+\end{array}
+}
+
 \begin{figure}[tp]
 \centering
 \fbox{
   \begin{minipage}{0.96\textwidth}
     \small
 \[
+\begin{array}{l}
+  \gray{\LintOnlyAST} \\ \hline
+  \gray{\LvarAST{}} \\ \hline
+  \gray{\LifAST{}} \\ \hline
+  \gray{\LwhileAST{}} \\ \hline
+  \gray{\LtupAST{}} \\ \hline
+  \gray{\LfunAST} \\ \hline
+  \gray{\LlambdaAST} \\ \hline
+  \LAnyAST \\
 \begin{array}{lcl}
-\Type &::= & \ldots \MID \key{Any} \\
-\itm{op} &::= & \ldots \MID \code{any-vector-length}
-     \MID \code{any-vector-ref} \MID \code{any-vector-set!}\\
-    &\MID& \code{boolean?} \MID \code{integer?} \MID \code{vector?}
-     \MID \code{procedure?} \MID \code{void?} \\
-\Exp &::=& \ldots
-     \MID \gray{ \PRIM{\itm{op}}{\Exp\ldots} } \\
-    &\MID& \INJECT{\Exp}{\FType} \MID \PROJECT{\Exp}{\FType} \\
- \Def &::=& \gray{ \FUNDEF{\Var}{\LP[\Var \code{:} \Type]\ldots\RP}{\Type}{\code{'()}}{\Exp} }\\
-  \LangAnyM{} &::=& \gray{ \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp} }
+%% \Type &::= & \ldots \MID \key{Any} \\
+%% \itm{op} &::= & \ldots \MID \code{any-vector-length}
+%%      \MID \code{any-vector-ref} \MID \code{any-vector-set!}\\
+%%     &\MID& \code{boolean?} \MID \code{integer?} \MID \code{vector?}
+%%      \MID \code{procedure?} \MID \code{void?} \\
+%% \Exp &::=& \ldots
+%%      \MID \gray{ \PRIM{\itm{op}}{\Exp\ldots} } \\
+%%     &\MID& \INJECT{\Exp}{\FType} \MID \PROJECT{\Exp}{\FType} \\
+%%  \Def &::=& \gray{ \FUNDEF{\Var}{\LP[\Var \code{:} \Type]\ldots\RP}{\Type}{\code{'()}}{\Exp} }\\
+  \LangAnyM{} &::=& \PROGRAMDEFSEXP{\code{'()}}{\LP\Def\ldots\RP}{\Exp}
+\end{array}
 \end{array}
 \]
 \end{minipage}