Lecture 16: Functions are People, too

###
Lecture 16: Functions are People, too

1. Returning functions from functions:

       #| Sigma : list-of-numbers -> number
          Purpose: add the nunbers in alon
          (define (Sigma alon) ... )

          Examples:
            (Sigma (list 1 2 3)) = 6
            (Sigma (list 10 2 13)) = 25
       |#
       #| Pi : list-of-numbers -> number
          Purpose: multiply the nunbers in alon
          (define (Pi alon) ... )

          Examples:
            (Pi (list 1 2 3)) = 6
            (Sigma (list 10 2 13)) = 260
       |#
       (define (Sigma alon)
         (cond
           ((empty? alon) 0)
           (else (+ (first alon) (Sigma (rest alon))))))
       (define (Pi alon)
         (cond
           ((empty? alon) 1)
           (else (* (first alon) (Pi (rest alon))))))
   Now abstract over the two:
       		    (define (make-pi/sigma base combine)
       		      (local ((define (F alon)
       				(cond
       				  ((empty? alon) base)
       				  (else (combine (first alon) (F (rest alon)))))))
       			F))
   How do we get back Sigma and Pi:
       (define Sigma (make-pi/sigma 0 +))
       (define Pi (make-pi/sigma 1 *))

   Let's verify that Pi and Sigma are defined properly.

         (make-pi/sigma 1 *)
       = (local ((define (F alon)
       	    (cond
       	      ((empty? alon) base)
       	      (else (combine (first alon) (F (rest alon)))))))
           F)
       = F with
                (define (F alon)
       	    (cond
       	      ((empty? alon) base)
       	      (else (combine (first alon) (F (rest alon))))))
            added to the Definitions window

       ;; So:

       (define (F alon)
         (cond
           ((empty? alon) base)
           (else (combine (first alon) (F (rest alon))))))
       (define Pi F)

   Now do this for Sigma and we get the following Definitions Window:

       (define (F alon)
         (cond
           ((empty? alon) 0)
           (else (+ (first alon) (F (rest alon))))))

       (define (F alon)
         (cond
           ((empty? alon) 1)
           (else (* (first alon) (F (rest alon))))))

       (define Sigma F)

       (define Pi F)

   Which one is it?

2. `LOCAL` renames as we lift out the function definitions!

   Before we lift local-definitions to the Definitions Window, we systematically rename them -- according to the laws of bindings and scope

   Modify above derivations slightly!

         (make-pi/sigma 1 *)
       = (local ((define (F alon)
       	    (cond
       	      ((empty? alon) base)
       	      (else (combine (first alon) (F (rest alon)))))))
           F)
       = (local ((define (FPI alon)
       	    (cond
       	      ((empty? alon) base)
       	      (else (combine (first alon) (FPI (rest alon)))))))
           FPI)
         because FPI does not occur at all in define's
       = FPI with
                (define (FPI alon)
       	    (cond
       	      ((empty? alon) base)
       	      (else (combine (first alon) (FPI (rest alon))))))
            added to the Definitions window

       ;; So now we have:

       (define (FPI alon)
         (cond
           ((empty? alon) base)
           (else (combine (first alon) (FPI (rest alon))))))

       (define Pi F)

       ;; in the Definition's window.

Matthias Felleisen | This page was generated on Fri Mar 5 09:04:41 CST 1999.