Jeremy Siek 6 years ago
parent
commit
97f3ff628c
1 changed files with 20 additions and 22 deletions
  1. 20 22
      book.tex

+ 20 - 22
book.tex

@@ -5254,38 +5254,37 @@ that does what its name suggests. The program then applies
 The definitional interpreter for $R_4$ is in
 Figure~\ref{fig:interp-R4}.
 
-
+%% change to do backpatching -Jeremy 
 \begin{figure}[tp]
 \begin{lstlisting}
-(define (interp-exp env)
+(define (interp-exp env global-env)
   (lambda (e)
-    (define recur (interp-exp env))
+    (define recur (interp-exp env global-env))
     (match e
       ...
       [`(,fun ,args ...)
-       (define arg-vals (map (interp-exp env) args))
-       (define fun-val ((interp-exp env) fun))
+       (define fun-val (recur fun))
+       (define arg-vals (map recur args))
        (match fun-val
 	 [`(lambda (,xs ...) ,body)
-	  (define new-env (append (map cons xs arg-vals) env))
-	  ((interp-exp new-env) body)]
+	  (define new-env (append (map cons xs arg-vals) global-env))
+	  ((interp-exp new-env global-env) body)]
 	 [else (error "interp-exp, expected function, not" fun-val)])]
       [else (error 'interp-exp "unrecognized expression")]
       )))
 
-(define (interp-def env)
-  (lambda (d)
-    (match d
-      [`(define (,f [,xs : ,ps] ...) : ,rt ,body)
-       (cons f `(lambda ,xs ,body))]
-      )))
+(define (interp-def d)
+  (match d
+    [`(define (,f [,xs : ,ps] ...) : ,rt ,body)
+     (cons f `(lambda ,xs ,body))]
+    ))
 
-(define (interp-R4 env)
-  (lambda (p)
-    (match p
-      [`(program ,ds ... ,body)
-       (let ([top-level (map  (interp-def '()) ds)])
-	 ((interp-exp top-level) body))])))
+(define (interp-R4 p)
+  (match p
+    [`(program ,ds ... ,body)
+     (let ([top-level (map interp-def ds)])
+       ((interp-exp top-level top-level) body))]
+    ))
 \end{lstlisting}
 \caption{Interpreter for the $R_4$ language.}
 \label{fig:interp-R4}
@@ -5440,8 +5439,7 @@ kinds of AST nodes to any of the intermediate languages?
 \label{fig:f1-syntax}
 \end{figure}
 
-
-To begin with, the syntax of $R_4$ is inconvenient for purposes of
+The syntax of $R_4$ is inconvenient for purposes of
 compilation because it conflates the use of function names and local
 variables and it conflates the application of primitive operations and
 the application of functions. This is a problem because we need to
@@ -5547,7 +5545,7 @@ language, whose syntax is defined in Figure~\ref{fig:x86-3}.
        \mid (\key{j}\itm{cc} \; \itm{label})
        \mid (\key{label} \; \itm{label})  } \\
      &\mid& (\key{indirect-callq}\;\Arg ) \mid (\key{leaq}\;\Arg\;\Arg)\\
-\Def &::= & (\key{define} \; (\itm{label}) \;\itm{int} \;\itm{info}\; \Stmt^{+})\\
+\Def &::= & (\key{define} \; (\itm{label}) \;\itm{int} \;\itm{info}\; \Instr^{+})\\
 x86_3 &::= & (\key{program} \;\itm{info} \;(\key{type}\;\itm{type})\;
                (\key{defines}\,\Def^{*}) \; \Instr^{+})
 \end{array}