Jeremy Siek пре 6 година
родитељ
комит
9e5bdd5000
1 измењених фајлова са 156 додато и 165 уклоњено
  1. 156 165
      book.tex

+ 156 - 165
book.tex

@@ -3253,8 +3253,8 @@ integers.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The syntax of $R_2$, extending $R_1$ with Booleans and
-  conditionals.}
+\caption{The syntax of $R_2$, extending $R_1$
+  (Figure~\ref{fig:r1-syntax}) with Booleans and conditionals.}
 \label{fig:r2-syntax}
 \label{fig:r2-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -3317,8 +3317,6 @@ short-circuiting behavior in the order of evaluation of its arguments.
           (match v1
           (match v1
             [#t (match (recur e2) [#t #t] [#f #f])]
             [#t (match (recur e2) [#t #t] [#f #f])]
             [#f #f])]
             [#f #f])]
-         [`(has-type ,e ,t)
-          (recur e)]
          [`(,op ,args ...)
          [`(,op ,args ...)
           #:when (set-member? primitives op)
           #:when (set-member? primitives op)
           (apply (interp-op op) (for/list ([e args]) (recur e)))]
           (apply (interp-op op) (for/list ([e args]) (recur e)))]
@@ -4412,13 +4410,16 @@ $40$, to which we add the $2$, the element at index $0$ of the
   \Type &::=& \gray{\key{Integer} \mid \key{Boolean}}
   \Type &::=& \gray{\key{Integer} \mid \key{Boolean}}
   \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}\\
   \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}\\
   \itm{cmp} &::= & \gray{  \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=}  } \\
   \itm{cmp} &::= & \gray{  \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=}  } \\
-  \Exp &::=& \gray{  \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp)  }  \\
+  \Exp &::=& \gray{  \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-}\;\Exp\;\Exp) }  \\
   &\mid&  \gray{  \Var \mid \LET{\Var}{\Exp}{\Exp}  }\\
   &\mid&  \gray{  \Var \mid \LET{\Var}{\Exp}{\Exp}  }\\
-  &\mid& \gray{  \key{\#t} \mid \key{\#f}
-    \mid (\key{and}\;\Exp\;\Exp) \mid (\key{not}\;\Exp)  }\\
-  &\mid& \gray{  (\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}  } \\
-  &\mid& (\key{vector}\;\Exp^{+}) \mid
-    (\key{vector-ref}\;\Exp\;\Int) \\
+  &\mid& \gray{ \key{\#t} \mid \key{\#f} 
+   \mid (\key{and}\;\Exp\;\Exp) 
+   \mid (\key{or}\;\Exp\;\Exp)
+   \mid (\key{not}\;\Exp) } \\
+  &\mid& \gray{  (\itm{cmp}\;\Exp\;\Exp) 
+   \mid \IF{\Exp}{\Exp}{\Exp}  } \\
+  &\mid& (\key{vector}\;\Exp^{+}) 
+   \mid (\key{vector-ref}\;\Exp\;\Int) \\
   &\mid& (\key{vector-set!}\;\Exp\;\Int\;\Exp)\\
   &\mid& (\key{vector-set!}\;\Exp\;\Int\;\Exp)\\
   &\mid& (\key{void}) \\
   &\mid& (\key{void}) \\
   R_3 &::=& (\key{program} \; \Exp)
   R_3 &::=& (\key{program} \; \Exp)
@@ -4426,7 +4427,8 @@ $40$, to which we add the $2$, the element at index $0$ of the
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{The syntax of $R_3$, extending $R_2$ with tuples.}
+\caption{The syntax of $R_3$, extending $R_2$
+  (Figure~\ref{fig:r2-syntax}) with tuples.}
 \label{fig:r3-syntax}
 \label{fig:r3-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -4809,8 +4811,8 @@ succeed.
 \end{lstlisting}
 \end{lstlisting}
   The parameter \code{rootstack\_ptr} is a pointer to the top of the
   The parameter \code{rootstack\_ptr} is a pointer to the top of the
   rootstack (which is an array of pointers).  The \code{cheney} function
   rootstack (which is an array of pointers).  The \code{cheney} function
-  also communicates with \code{collect} through several global
-  variables, the \code{fromspace\_begin} and \code{fromspace\_end}
+  also communicates with \code{collect} through the global
+  variables \code{fromspace\_begin} and \code{fromspace\_end}
   mentioned in Figure~\ref{fig:gc-header} as well as the pointers for
   mentioned in Figure~\ref{fig:gc-header} as well as the pointers for
   the ToSpace:
   the ToSpace:
 \begin{lstlisting}
 \begin{lstlisting}
@@ -5469,11 +5471,13 @@ inside each other.
   \Type &::=& \gray{ \key{Integer} \mid \key{Boolean}
   \Type &::=& \gray{ \key{Integer} \mid \key{Boolean}
          \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}  } \mid (\Type^{*} \; \key{->}\; \Type) \\
          \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}  } \mid (\Type^{*} \; \key{->}\; \Type) \\
 \itm{cmp} &::= & \gray{  \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=}  } \\
 \itm{cmp} &::= & \gray{  \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=}  } \\
-  \Exp &::=& \gray{ \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp)}  \\
-     &\mid&  \gray{ \Var \mid \LET{\Var}{\Exp}{\Exp} }\\
-    &\mid& \gray{ \key{\#t} \mid \key{\#f} \mid
-      (\key{and}\;\Exp\;\Exp) \mid (\key{not}\;\Exp)} \\
-      &\mid& \gray{(\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}} \\
+  \Exp &::=& \gray{ \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-}\;\Exp\;\Exp)}  \\
+    &\mid&  \gray{ \Var \mid \LET{\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{(\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}} \\
   &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
   &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
     (\key{vector-ref}\;\Exp\;\Int)} \\
     (\key{vector-ref}\;\Exp\;\Int)} \\
   &\mid& \gray{(\key{vector-set!}\;\Exp\;\Int\;\Exp)\mid (\key{void})} \\
   &\mid& \gray{(\key{vector-set!}\;\Exp\;\Int\;\Exp)\mid (\key{void})} \\
@@ -5484,7 +5488,8 @@ inside each other.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{Syntax of $R_4$, extending $R_3$ with functions.}
+\caption{Syntax of $R_4$, extending $R_3$ (Figure~\ref{fig:r3-syntax})
+  with functions.}
 \label{fig:r4-syntax}
 \label{fig:r4-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -6392,10 +6397,12 @@ $R_3$).
      \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}
      \mid (\key{Vector}\;\Type^{+}) \mid \key{Void}
      \mid (\Type^{*} \; \key{->}\; \Type)} \\
      \mid (\Type^{*} \; \key{->}\; \Type)} \\
   \Exp &::=& \gray{\Int \mid (\key{read}) \mid (\key{-}\;\Exp)
   \Exp &::=& \gray{\Int \mid (\key{read}) \mid (\key{-}\;\Exp)
-     \mid (\key{+} \; \Exp\;\Exp)}  \\
-    &\mid&  \gray{\Var \mid \LET{\Var}{\Exp}{\Exp}
-     \mid \key{\#t} \mid \key{\#f} \mid
-           (\key{and}\;\Exp\;\Exp) \mid (\key{not}\;\Exp)} \\
+     \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-} \; \Exp\;\Exp)}  \\
+    &\mid&  \gray{\Var \mid \LET{\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 \IF{\Exp}{\Exp}{\Exp}} \\
     &\mid& \gray{(\key{eq?}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}} \\
     &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
     &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
           (\key{vector-ref}\;\Exp\;\Int)} \\
           (\key{vector-ref}\;\Exp\;\Int)} \\
@@ -6408,7 +6415,8 @@ $R_3$).
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{Syntax of $R_5$, extending $R_4$ with \key{lambda}.}
+\caption{Syntax of $R_5$, extending $R_4$ (Figure~\ref{fig:r4-syntax}) 
+  with \key{lambda}.}
 \label{fig:r5-syntax}
 \label{fig:r5-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -6772,7 +6780,103 @@ reference results in a run-time contract violation.
    (vector-ref (vector 42) #t)
    (vector-ref (vector 42) #t)
 \end{lstlisting}
 \end{lstlisting}
 
 
-Let us consider how we might compile Racket to x86, thinking about the
+\begin{figure}[tp]
+\centering
+\fbox{
+\begin{minipage}{0.97\textwidth}
+\[
+\begin{array}{rcl}
+  \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
+\Exp &::=& \Int \mid (\key{read}) \mid (\key{-}\;\Exp) 
+      \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-} \; \Exp\;\Exp)  \\
+     &\mid&  \Var \mid \LET{\Var}{\Exp}{\Exp} \\
+     &\mid& \key{\#t} \mid \key{\#f} 
+      \mid (\key{and}\;\Exp\;\Exp) 
+      \mid (\key{or}\;\Exp\;\Exp) 
+      \mid (\key{not}\;\Exp) \\
+     &\mid& (\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp} \\
+     &\mid& (\key{vector}\;\Exp^{+}) \mid
+      (\key{vector-ref}\;\Exp\;\Exp) \\
+     &\mid& (\key{vector-set!}\;\Exp\;\Exp\;\Exp) \mid (\key{void}) \\
+     &\mid& (\Exp \; \Exp^{*}) \mid (\key{lambda}\; (\Var^{*}) \; \Exp) \\
+     & \mid & (\key{boolean?}\;\Exp) \mid (\key{integer?}\;\Exp)\\
+     & \mid & (\key{vector?}\;\Exp) \mid (\key{procedure?}\;\Exp) \mid (\key{void?}\;\Exp) \\
+  \Def &::=& (\key{define}\; (\Var \; \Var^{*}) \; \Exp) \\
+R_7  &::=& (\key{program} \; \Def^{*}\; \Exp)
+\end{array}
+\]
+\end{minipage}
+}
+\caption{Syntax of $R_7$, an untyped language (a subset of Racket).}
+\label{fig:r7-syntax}
+\end{figure}
+
+The syntax of $R_7$, our subset of Racket, is defined in
+Figure~\ref{fig:r7-syntax}.
+%
+The definitional interpreter for $R_7$ is given in
+Figure~\ref{fig:interp-R7}.
+
+\begin{figure}[tbp]
+\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
+(define (get-tagged-type v) (match v [`(tagged ,v1 ,ty) ty]))
+
+(define (valid-op? op) (member op '(+ - and or not)))
+
+(define (interp-r7 env)
+  (lambda (ast)
+    (define recur (interp-r7 env))
+    (match ast
+      [(? symbol?) (lookup ast env)]
+      [(? integer?) `(inject ,ast Integer)]
+      [#t `(inject #t Boolean)]
+      [#f `(inject #f Boolean)]
+      [`(read) `(inject ,(read-fixnum) Integer)]
+      [`(lambda (,xs ...) ,body)
+       `(inject (lambda ,xs ,body ,env) (,@(map (lambda (x) 'Any) xs) -> Any))]
+      [`(define (,f ,xs ...) ,body)
+       (mcons f `(lambda ,xs ,body))]
+      [`(program ,ds ... ,body)
+       (let ([top-level (for/list ([d ds]) ((interp-r7 '()) d))])
+         (for/list ([b top-level])
+           (set-mcdr! b (match (mcdr b)
+                          [`(lambda ,xs ,body)
+                           `(inject (lambda ,xs ,body ,top-level)
+                                    (,@(map (lambda (x) 'Any) xs) -> Any))])))
+         ((interp-r7 top-level) body))]
+      [`(vector ,(app recur elts) ...)
+       (define tys (map get-tagged-type elts))
+       `(inject ,(apply vector elts) (Vector ,@tys))]
+      [`(vector-set! ,(app recur v1) ,n ,(app recur v2))
+         (match v1
+           [`(inject ,vec ,ty)
+             (vector-set! vec n v2)
+            `(inject (void) Void)])]
+      [`(vector-ref ,(app recur v) ,n)
+       (match v [`(inject ,vec ,ty) (vector-ref vec n)])]
+      [`(let ([,x ,(app recur v)]) ,body)
+       ((interp-r7 (cons (cons x v) env)) body)]
+      [`(,op ,es ...) #:when (valid-op? op)
+       (interp-r7-op op (for/list ([e es]) (recur e)))]
+      [`(eq? ,(app recur l) ,(app recur r))
+       `(inject ,(equal? l r) Boolean)]
+      [`(if ,(app recur q) ,t ,f)
+       (match q
+         [`(inject #f Boolean) (recur f)]
+         [else (recur t)])]
+      [`(,(app recur f-val) ,(app recur vs) ...)
+       (match f-val
+         [`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
+          (define new-env (append (map cons xs vs) lam-env))
+          ((interp-r7 new-env) body)]
+         [else (error "interp-r7, expected function, not" f-val)])])))
+\end{lstlisting}
+\caption{Interpreter for the $R_7$ language. UPDATE ME -Jeremy}
+\label{fig:interp-R7}
+\end{figure}
+
+
+Let us consider how we might compile $R_7$ to x86, thinking about the
 first example above. Our bit-level representation of the Boolean
 first example above. Our bit-level representation of the Boolean
 \code{\#f} is zero and similarly for the integer \code{0}.  However,
 \code{\#f} is zero and similarly for the integer \code{0}.  However,
 \code{(not \#f)} should produce \code{\#t} whereas \code{(not 0)}
 \code{(not \#f)} should produce \code{\#t} whereas \code{(not 0)}
@@ -6815,9 +6919,10 @@ define in Section~\ref{sec:r6-lang}. The $R_6$ language provides the
 fundamental support for polymorphism and runtime types that we need to
 fundamental support for polymorphism and runtime types that we need to
 support dynamic typing.
 support dynamic typing.
 
 
-We shall implement our untyped language $R_7$ by compiling it to
-$R_6$. We define $R_7$ in Section~\ref{sec:r7-lang} and describe the
-compilation of $R_6$ and $R_7$ in the remainder of this chapter.
+We shall implement our untyped language $R_7$ by compiling it to $R_6$
+(Section~\ref{sec:compile-r7}), but first we describe the how to
+extend our compiler to handle the new features of $R_6$
+(Sections~\ref{sec:shrink-r6} and \ref{sec:select-r6}).
 
 
 \section{The $R_6$ Language: Typed Racket $+$ \key{Any}}
 \section{The $R_6$ Language: Typed Racket $+$ \key{Any}}
 \label{sec:r6-lang}
 \label{sec:r6-lang}
@@ -6835,10 +6940,12 @@ compilation of $R_6$ and $R_7$ in the remainder of this chapter.
      \mid (\key{Any}^{*} \; \key{->}\; \key{Any})\\
      \mid (\key{Any}^{*} \; \key{->}\; \key{Any})\\
   \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
   \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
   \Exp &::=& \gray{\Int \mid (\key{read}) \mid (\key{-}\;\Exp)
   \Exp &::=& \gray{\Int \mid (\key{read}) \mid (\key{-}\;\Exp)
-     \mid (\key{+} \; \Exp\;\Exp)}  \\
+     \mid (\key{+} \; \Exp\;\Exp) \mid (\key{-} \; \Exp\;\Exp)}  \\
     &\mid&  \gray{\Var \mid \LET{\Var}{\Exp}{\Exp}} \\
     &\mid&  \gray{\Var \mid \LET{\Var}{\Exp}{\Exp}} \\
-    &\mid& \gray{\key{\#t} \mid \key{\#f} \mid
-           (\key{and}\;\Exp\;\Exp) \mid (\key{not}\;\Exp)} \\
+    &\mid& \gray{\key{\#t} \mid \key{\#f} 
+     \mid (\key{and}\;\Exp\;\Exp) 
+     \mid (\key{or}\;\Exp\;\Exp) 
+     \mid (\key{not}\;\Exp)} \\
     &\mid& \gray{(\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}} \\
     &\mid& \gray{(\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp}} \\
     &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
     &\mid& \gray{(\key{vector}\;\Exp^{+}) \mid
           (\key{vector-ref}\;\Exp\;\Int)} \\
           (\key{vector-ref}\;\Exp\;\Int)} \\
@@ -6854,7 +6961,8 @@ compilation of $R_6$ and $R_7$ in the remainder of this chapter.
 \]
 \]
 \end{minipage}
 \end{minipage}
 }
 }
-\caption{Syntax of $R_6$, extending $R_5$ with \key{Any}.}
+\caption{Syntax of $R_6$, extending $R_5$ (Figure~\ref{fig:r5-syntax})
+  with \key{Any}.}
 \label{fig:r6-syntax}
 \label{fig:r6-syntax}
 \end{figure}
 \end{figure}
 
 
@@ -6871,73 +6979,49 @@ $(\key{boolean?}\,e)$ etc., expect a tagged value and return \key{\#t}
 if the tag corresponds to the predicate, and return \key{\#t}
 if the tag corresponds to the predicate, and return \key{\#t}
 otherwise.
 otherwise.
 %
 %
-The type checker for $R_6$ is given in Figure~\ref{fig:typecheck-R6}.
+Selctions from the type checker for $R_6$ are shown in
+Figure~\ref{fig:typecheck-R6} and the definitional interpreter for
+$R_6$ is in Figure~\ref{fig:interp-R6}.
 
 
-\begin{figure}[tbp]
+\begin{figure}[btp]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
 \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
-(define type-predicates
-  (set 'boolean? 'integer? 'vector? 'procedure?))
-
 (define (typecheck-R6 env)
 (define (typecheck-R6 env)
   (lambda (e)
   (lambda (e)
     (define recur (typecheck-R6 env))
     (define recur (typecheck-R6 env))
     (match e
     (match e
-       [`(inject ,(app recur new-e e-ty) ,ty)
+       [`(inject ,e ,ty)
+        (define-values (new-e e-ty) (recur e))
         (cond
         (cond
          [(equal? e-ty ty)
          [(equal? e-ty ty)
           (values `(inject ,new-e ,ty) 'Any)]
           (values `(inject ,new-e ,ty) 'Any)]
          [else
          [else
           (error "inject expected ~a to have type ~a" e ty)])]
           (error "inject expected ~a to have type ~a" e ty)])]
-       [`(project ,(app recur new-e e-ty) ,ty)
+       [`(project ,e ,ty)
+        (define-values (new-e e-ty) (recur e))
         (cond
         (cond
          [(equal? e-ty 'Any)
          [(equal? e-ty 'Any)
           (values `(project ,new-e ,ty) ty)]
           (values `(project ,new-e ,ty) ty)]
          [else
          [else
           (error "project expected ~a to have type Any" e)])]
           (error "project expected ~a to have type Any" e)])]
-       [`(,pred ,e) #:when (set-member? type-predicates pred)
+       [`(vector-ref ,e ,i)
         (define-values (new-e e-ty) (recur e))
         (define-values (new-e e-ty) (recur e))
-        (cond
-         [(equal? e-ty 'Any)
-          (values `(,pred ,new-e) 'Boolean)]
-         [else
-          (error "predicate expected arg of type Any, not" e-ty)])]
-       [`(vector-ref ,(app recur e t) ,i)
-        (match t
+        (match e-ty
           [`(Vector ,ts ...) ...]
           [`(Vector ,ts ...) ...]
-          [`(Vectorof ,t)
+          [`(Vectorof ,ty)
            (unless (exact-nonnegative-integer? i)
            (unless (exact-nonnegative-integer? i)
              (error 'type-check "invalid index ~a" i))
              (error 'type-check "invalid index ~a" i))
-           (values `(vector-ref ,e ,i) t)]
-          [else (error "expected a vector in vector-ref, not" t)])]
-       [`(vector-set! ,(app recur e-vec t-vec) ,i
-                       ,(app recur e-arg t-arg))
-        (match t-vec
-          [`(Vector ,ts ...) ...]
-          [`(Vectorof ,t)
-           (unless (exact-nonnegative-integer? i)
-             (error 'type-check "invalid index ~a" i))
-           (unless (equal? t t-arg)
-             (error 'type-check "type mismatch in vector-set! ~a ~a"
-                    t t-arg))
-           (values `(vector-set! ,e-vec ,i ,e-arg) 'Void)]
-          [else (error 'type-check
-                       "expected a vector in vector-set!, not ~a"
-                       t-vec)])]
+           (values `(vector-ref ,new-e ,i) ty)]
+          [else (error "expected a vector in vector-ref, not" e-ty)])]
         ...
         ...
       )))
       )))
 \end{lstlisting}
 \end{lstlisting}
-\caption{Type checker for the $R_6$ language.}
+\caption{Type checker for parts of the $R_6$ language.}
 \label{fig:typecheck-R6}
 \label{fig:typecheck-R6}
 \end{figure}
 \end{figure}
 
 
 % to do: add rules for vector-ref, etc. for Vectorof
 % to do: add rules for vector-ref, etc. for Vectorof
-
-
 %Also, \key{eq?} is extended to operate on values of type \key{Any}.
 %Also, \key{eq?} is extended to operate on values of type \key{Any}.
 
 
-Figure~\ref{fig:interp-R6} shows the definitional interpreter
-for $R_6$.
-
 \begin{figure}[tbp]
 \begin{figure}[tbp]
 \begin{lstlisting}
 \begin{lstlisting}
 (define primitives (set 'boolean? ...))
 (define primitives (set 'boolean? ...))
@@ -6973,101 +7057,8 @@ for $R_6$.
 
 
 \clearpage
 \clearpage
 
 
-\section{The $R_7$ Language: Untyped Racket}
-\label{sec:r7-lang}
-
-\begin{figure}[tp]
-\centering
-\fbox{
-\begin{minipage}{0.97\textwidth}
-\[
-\begin{array}{rcl}
-  \itm{cmp} &::= & \key{eq?} \mid \key{<} \mid \key{<=} \mid \key{>} \mid \key{>=} \\
-\Exp &::=& \Int \mid (\key{read}) \mid (\key{-}\;\Exp) \mid (\key{+} \; \Exp\;\Exp)  \\
-     &\mid&  \Var \mid \LET{\Var}{\Exp}{\Exp} \\
-     &\mid& \key{\#t} \mid \key{\#f} \mid
-      (\key{and}\;\Exp\;\Exp) \mid (\key{not}\;\Exp) \\
-     &\mid& (\itm{cmp}\;\Exp\;\Exp) \mid \IF{\Exp}{\Exp}{\Exp} \\
-     &\mid& (\key{vector}\;\Exp^{+}) \mid
-      (\key{vector-ref}\;\Exp\;\Exp) \\
-     &\mid& (\key{vector-set!}\;\Exp\;\Exp\;\Exp) \mid (\key{void}) \\
-     &\mid& (\Exp \; \Exp^{*}) \mid (\key{lambda}\; (\Var^{*}) \; \Exp) \\
-     & \mid & (\key{boolean?}\;\Exp) \mid (\key{integer?}\;\Exp)\\
-     & \mid & (\key{vector?}\;\Exp) \mid (\key{procedure?}\;\Exp) \mid (\key{void?}\;\Exp) \\
-  \Def &::=& (\key{define}\; (\Var \; \Var^{*}) \; \Exp) \\
-R_7  &::=& (\key{program} \; \Def^{*}\; \Exp)
-\end{array}
-\]
-\end{minipage}
-}
-\caption{Syntax of $R_7$, an untyped language (a subset of Racket).}
-\label{fig:r7-syntax}
-\end{figure}
-
-The syntax of $R_7$, our subset of Racket, is defined in
-Figure~\ref{fig:r7-syntax}.
-%
-The definitional interpreter for $R_7$ is given in
-Figure~\ref{fig:interp-R7}.
-
-\begin{figure}[tbp]
-\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
-(define (get-tagged-type v) (match v [`(tagged ,v1 ,ty) ty]))
-
-(define (valid-op? op) (member op '(+ - and or not)))
-
-(define (interp-r7 env)
-  (lambda (ast)
-    (define recur (interp-r7 env))
-    (match ast
-      [(? symbol?) (lookup ast env)]
-      [(? integer?) `(inject ,ast Integer)]
-      [#t `(inject #t Boolean)]
-      [#f `(inject #f Boolean)]
-      [`(read) `(inject ,(read-fixnum) Integer)]
-      [`(lambda (,xs ...) ,body)
-       `(inject (lambda ,xs ,body ,env) (,@(map (lambda (x) 'Any) xs) -> Any))]
-      [`(define (,f ,xs ...) ,body)
-       (mcons f `(lambda ,xs ,body))]
-      [`(program ,ds ... ,body)
-       (let ([top-level (for/list ([d ds]) ((interp-r7 '()) d))])
-         (for/list ([b top-level])
-           (set-mcdr! b (match (mcdr b)
-                          [`(lambda ,xs ,body)
-                           `(inject (lambda ,xs ,body ,top-level)
-                                    (,@(map (lambda (x) 'Any) xs) -> Any))])))
-         ((interp-r7 top-level) body))]
-      [`(vector ,(app recur elts) ...)
-       (define tys (map get-tagged-type elts))
-       `(inject ,(apply vector elts) (Vector ,@tys))]
-      [`(vector-set! ,(app recur v1) ,n ,(app recur v2))
-         (match v1
-           [`(inject ,vec ,ty)
-             (vector-set! vec n v2)
-            `(inject (void) Void)])]
-      [`(vector-ref ,(app recur v) ,n)
-       (match v [`(inject ,vec ,ty) (vector-ref vec n)])]
-      [`(let ([,x ,(app recur v)]) ,body)
-       ((interp-r7 (cons (cons x v) env)) body)]
-      [`(,op ,es ...) #:when (valid-op? op)
-       (interp-r7-op op (for/list ([e es]) (recur e)))]
-      [`(eq? ,(app recur l) ,(app recur r))
-       `(inject ,(equal? l r) Boolean)]
-      [`(if ,(app recur q) ,t ,f)
-       (match q
-         [`(inject #f Boolean) (recur f)]
-         [else (recur t)])]
-      [`(,(app recur f-val) ,(app recur vs) ...)
-       (match f-val
-         [`(inject (lambda (,xs ...) ,body ,lam-env) ,ty)
-          (define new-env (append (map cons xs vs) lam-env))
-          ((interp-r7 new-env) body)]
-         [else (error "interp-r7, expected function, not" f-val)])])))
-\end{lstlisting}
-\caption{Interpreter for the $R_7$ language. UPDATE ME -Jeremy}
-\label{fig:interp-R7}
-\end{figure}
-
+%\section{The $R_7$ Language: Untyped Racket}
+%\label{sec:r7-lang}
 
 
 
 
 %% \section{Compiling $R_6$}
 %% \section{Compiling $R_6$}