notes12s - DarrenKuo cs61atd OH:W56pm 1)"if" I II , III...

Info iconThis preview shows pages 1–3. Sign up to view the full content.

View Full Document Right Arrow Icon
Darren Kuo cs61a-td OH: W 5 - 6pm CS61A Week 12 – Metacircular evaluator  1) In the meta-circular evaluator, "if" expressions are evaluated in the following way:  I. the predicate is evaluated II. if the predicate is true, then the consequent expression is evaluated and returned III. otherwise, the alternative expression is evaluated and returned Consider the alternative defintion of eval-if (define (eval-if exp env) (let ((pred (mc-eval (if-predicate exp) env)) (consequent (mc-eval (if-consequent exp) env)) (alternative (mc-eval (if-alternative exp) env))) (if (true? pred) consequent predicate))) a) Will this have the same semantics as "if" as we know it, meaning, does this definition  of eval-if have the same behavior of the old eval-if? NO.     b) Well, the answer is no, but explain why. If you can think of one situation where it  breaks down, keep going. Think of three different kinds of scenerios where the behavior  of this definition of eval-if is different, and write small programs to demonstrate your  points. Division by zero error, infinite loop, and side effects.
Background image of page 1

Info iconThis preview has intentionally blurred sections. Sign up to view the full version.

View Full Document Right Arrow Icon
2) Suppose we want to add a new special form called  iff  to the metacircular evaluator,  that's like an  if  where all the subexpressions after the predicate form the consequent, and  there is no alternative. So while  if  can only take one subexpression as the consequent, and  one subexpression as the alternative,  iff  can take any number of subexpressions as the  consequent. If the predicate is true, all the subexpressions in the consequent should be  evaluated in sequence, and the value of the  iff  is the value of the last subexpression. If the  predicate is false,  iff  should produce #f. For example:  > (iff (= 1 2) 3 4 5 6) #f > (iff (= 1 1) 3 4 5 6) 6 1. Is this mainly a change to the  eval  part or the  apply  part of the interpreter? Eval. 2.  Implement this feature. There are two common ways to do this: either you can add a new procedure that  evaluates an  iff  expression, or you can write a procedure to translate an  iff  expression  into an expression that the evaluator already understands.  For the first approach, you could write a routine called  eval-iff  that evaluates the  predicate, and proceeds to call  eval-sequence  to execute the body if the predicate's  value is true.  For the second approach, you could write a routine called  iff- if  that accepts an  iff  expression and turns it into an  if  expression, where the consequent is a sequence starting  with  begin  and the alternative is  #f In both approaches, you need to add a clause to the big  cond  in  mc-eval , and you  probably want to write selectors for the parts of an 
Background image of page 2
Image of page 3
This is the end of the preview. Sign up to access the rest of the document.

{[ snackBarMessage ]}

Page1 / 13

notes12s - DarrenKuo cs61atd OH:W56pm 1)"if" I II , III...

This preview shows document pages 1 - 3. Sign up to view the full document.

View Full Document Right Arrow Icon
Ask a homework question - tutors are online