(let ((x 1)
(y 2))
(dynlet ((:x 3))
(let ((p (lambda (a) (+ x y (dyn :x) (dyn :z) a))))
(let ((x 30)
(y 40))
(dynlet ((:x 10)
(:z 20))
(p 20))))))
Answer: 53
(let ((x 5))
(let ((f (let ((x 6))
(lambda (m y)
(if m
(set! x (+ x y))
x)))))
(begin
(f x x)
(f (not x) x))))
Answer: 11
((lambda (x) (+ x x)) (let ((x 5)) (add1 x)))Answer: 12
(lambda (c b a)
((lambda (d b e)
((lambda (c)
((lambda (a e f)
(a b d))
f c e))
((a d) b)))
(a d b)))
Answer:
(lambda (c b a)
((lambda (d b e)
((lambda (c)
((lambda (a e f)
([a : 0 0] [b : 2 1] [d : 2 0]))
[f : free] [c : 0 0] [e : 1 2]))
(([a : 1 2] [d : 0 0]) [b : 0 1])))
([a : 0 2] [d : free] [b : 0 1])))
(unless test exp)The semantics is: ``Evaluate test. If it is not true evaluate exp, otherwise return whatever test evaluated to''.
Complete the appropriate clause to the interpreter below so that it
now supports the unless feature. Assume the parser uses
(define-record unless (test exp)).
(Answers in strong text)
(define eval-exp
(lambda (exp env)
(variant-case exp
(lit (datum) datum)
(varref (var) (apply-env env var))
(app (rator rands)
(let ((proc (eval-exp rator env))
(args (eval-rands rands env)))
(apply-proc proc args)))
(if (test then else)
(if (true-value? (eval-exp test env))
(eval-exp then env)
(eval-exp else env)))
(unless (test exp)
(let ((t (eval-exp test env)))
(if (true-value? t)
t
(eval-exp exp env))))
(else (error 'eval-exp "Invalid abstract syntax ~s " exp)))))
<exp> ::= <var>
| (lambda (<var>) <exp>)
| (<exp> <exp>)
Answer:
(define max-depth
(lambda (exp var)
(letrec ((md (lambda (exp depth)
(cond
[(variable? exp)
(if (eq? exp var)
depth
-1)]
[(lambda? exp)
(if (eq? (lambda->formal exp) var)
(md (lambda->body exp) 0)
(md (lambda->body exp) (add1 depth)))]
[else
(max (md (car exp) depth)
(md (cadr exp) depth))]))))
(md exp 0))))
(define variable? symbol?)
(define lambda?
(lambda (exp)
(eq? (car exp) 'lambda)))
(define lambda->formal caadr)
(define lambda->body caddr)