|
@@ -5254,38 +5254,37 @@ that does what its name suggests. The program then applies
|
|
The definitional interpreter for $R_4$ is in
|
|
The definitional interpreter for $R_4$ is in
|
|
Figure~\ref{fig:interp-R4}.
|
|
Figure~\ref{fig:interp-R4}.
|
|
|
|
|
|
-
|
|
|
|
|
|
+%% change to do backpatching -Jeremy
|
|
\begin{figure}[tp]
|
|
\begin{figure}[tp]
|
|
\begin{lstlisting}
|
|
\begin{lstlisting}
|
|
-(define (interp-exp env)
|
|
|
|
|
|
+(define (interp-exp env global-env)
|
|
(lambda (e)
|
|
(lambda (e)
|
|
- (define recur (interp-exp env))
|
|
|
|
|
|
+ (define recur (interp-exp env global-env))
|
|
(match e
|
|
(match e
|
|
...
|
|
...
|
|
[`(,fun ,args ...)
|
|
[`(,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
|
|
(match fun-val
|
|
[`(lambda (,xs ...) ,body)
|
|
[`(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, expected function, not" fun-val)])]
|
|
[else (error 'interp-exp "unrecognized expression")]
|
|
[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}
|
|
\end{lstlisting}
|
|
\caption{Interpreter for the $R_4$ language.}
|
|
\caption{Interpreter for the $R_4$ language.}
|
|
\label{fig:interp-R4}
|
|
\label{fig:interp-R4}
|
|
@@ -5440,8 +5439,7 @@ kinds of AST nodes to any of the intermediate languages?
|
|
\label{fig:f1-syntax}
|
|
\label{fig:f1-syntax}
|
|
\end{figure}
|
|
\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
|
|
compilation because it conflates the use of function names and local
|
|
variables and it conflates the application of primitive operations and
|
|
variables and it conflates the application of primitive operations and
|
|
the application of functions. This is a problem because we need to
|
|
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{j}\itm{cc} \; \itm{label})
|
|
\mid (\key{label} \; \itm{label}) } \\
|
|
\mid (\key{label} \; \itm{label}) } \\
|
|
&\mid& (\key{indirect-callq}\;\Arg ) \mid (\key{leaq}\;\Arg\;\Arg)\\
|
|
&\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})\;
|
|
x86_3 &::= & (\key{program} \;\itm{info} \;(\key{type}\;\itm{type})\;
|
|
(\key{defines}\,\Def^{*}) \; \Instr^{+})
|
|
(\key{defines}\,\Def^{*}) \; \Instr^{+})
|
|
\end{array}
|
|
\end{array}
|