recitation 20: metacircular evaluator
=========================================================================
eval/apply:
eval needs exp & env
apply needs proc & args
concrete representation for environment, list of frames
=========================================================================
lexical scoping (static scoping): look up free variables in
procedure's surrounding lexical environment -- REGULAR SCHEME
dynamic scoping: look up free variables in caller's environment,
don't need env pointer any more!!
(define a 1)
(define (b) a)
(define (c a) (lambda (a) (b)))
(define d (c 2))
(d 3)
* draw environment diagram to execute with lexical scoping
* draw environment diagram to execute with dynamic scoping
=========================================================================
semantics: what the language *means*, model of computation
syntax: particulars of *writing* expressions
abstracted by the detectors & accessors
building our own evaluator allows us to modify the syntax and/or
semantics of the language
semantic implementation vs. syntactic transformation (desugar it)
* write a syntactic translator for let*
* write a semantic implementation for let*
=========================================================================
(ex 4.8 from book)
* write a syntactic translator for named-let
(let <var> <bindings> <body>)
The <bindings> and <body> are just as in ordinary let, except that
<var> is bound within <body> to a procedure whose body is <body> and
whose parameters are the variables in the <bindings>. Thus, one can
repeatedly execute the <body> by invoking the procedure named
<var>. For example, the iterative Fibonacci procedure
can be rewritten using named let as follows:
(define (fib n)
(let fib-iter ((a 1)
(b 0)
(count n))
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1)))))
=========================================================================