6.001 Recitation – April 11, 2003

 

RI: Konrad Tollmar

 

• Eval / Apply revisit

• Lazy evaluation

 

1. Break

Implement a special-form break that allow you to stop your code and inspect the environment

 

 

 

 

 

2. Derived expressions

 

Make cond a derived expression of the special form if, i.e. convert the cond expression to an if expression and evalute it as such.

 

(cond (<pred1> <actions-1>)
      (<pred2> <actions-2>)
      ...
      (<predn> <actions-n>)
      (else <actions))
 

rewritten to

 
(if <pred1>
    (begin <actions-1>)
    (if <pred2>
            (begin <actions-2>)
        ...
            (if <predn>
                (begin <actions-n>)
                (begin <actions>))))

 

Complete the procedures below, including cond->if, that converts a cond expression into an if expression.

 

(define (conditional? exp) (tagged-list? exp <<2A>> ))
(define (cond-clauses conditional) (cdr conditional))
 
(define (cond-no-clauses? clauses) (null? clauses))
(define (cond-first-clause clauses) (car clauses))
(define (cond-rest-clause clauses) (cdr clauses))
 
(define (cond-else-clause? clause) (eq? (cond-predicate clause) 'else))
(define (cond-predicate clause) (car clause)
(define (cond-actions clause) (cdr clause))
 
(define (cond->if cond-exp)
  (define (expand clauses)
    (cond ((cond-else-clause? (cond-first-clause clauses))
           (if (cond-no-clauses? (cond-rest-clauses clauses))
               (sequence->begin
                          ( << 2B >> )
               (error "ELSE clause isn't last")))
          (else
               (make-if ( << 2C >> )
                             (sequence->begin
                              ( << 2D >> ))
                             (expand ( << 2E >> )))))))
  (expand (cond-clauses cond-exp)))   

 

 

 

 

3. Normal vers Applicative Order

What happen if we evaluate:

 (define (try a b)

           (if (= a 0) 1 b))

 

 

(try 0 (/ 1 0))

 (try 0 (pi-to-this-many-digits 10000000))

 

In Normal vers Applicative Order

?

 

 

 

 

 

 

 

 

4. Normal order side-effects

 

 
(define count 0)
 
(define p
  ( (begin
     (set! count (+ count 1))
     (* x 3)) lazy-memo))
 
(define x 5)

 

3. Test Normal vers Applicative Order

 

Write a function normal-order? That returns #t if the language is normal order and #f if the language is applicative order.

 

 

4. Lazy Lists

 

What will happen when we evaluate the following?

 

 

(define ones (cons 1 ones))

 

 

 

How can we use this to produce sequences of number?

 

5. Create Infinite Streams

 

Show how we could create a stream of integers in an alternative way, given the stream ones (1 1 1 1 ….) and the procedure add-streams.

 

(define ones (cons-streams 1 ones))

 

 

(define (add-streams s1 s2)

   (cons-stream (+ (stream-car s1) (stream-car s2))

           (add-streams (stream-cdr s1) (stream-cdr s2)))))

 

 

 

6. Define Fibonacci numbers with stream.

Write a procedure, (fibs), that returns a stream of Fibonacci numbers. The Fibonacci series goes

 

 

    (1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 ...)

 

It starts with two 1's, then each successive value is the sum of the previous two.