Lecture 14: More Power, More Control



  1. Here are two programs (assign as warm-up work):
    #| 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 (F base combine alon)
    		      (cond
    			((empty? alon) base)
    			(else (combine (first alon) (F base combine (rest alon))))))
    
    How do we get back Sigma and Pi:
    (define (Sigma alon)
      (F 0 + alon))
    
    (define (Pi alon)
      (F 1 * alon))
    
  2. Okay, so let's define smallest
    ;; smallest : alon [not empty] -> number
    ;; Purpose: finds smallest number in non-empty list
    (define (smallest alon)
      (F (first alon) min alon))
    
  3. Okay, let's define demands-going-up
    ;; demands-going-up : number alon -> alon
    ;; Purpose: filters out all those n's in alon that are larger than number 
    (define (demands-going-up cf alon)
      (local ((define (greater-than f rst)
    	    (cond
    	      ((> f cf) (cons f rst))
    	      (else rst))))
        (F empty greater-than alon)))
    
  4. And how about project from database?
    ;; project : db -> list-of-symbols
    ;; Purpose: it produces the names of those employees in a-db 
    ;;    who earn more than $1000000 (as a list)
    (define (project a-db)
      (local ((define (more-than-100000 f rst)
    	    (cond
    	      ((> (pr-salary f) 1000000) (cons f rst))
    	      (else rst))))
        (F empty more-than-100000 a-db)))
    
    Wow: F now consumes a list of personnel records, not just a list of numbers. How can that be?
  5. A list-of-numbers is either
     - empty or
     - (cons N L)
         where N is a number
         and L is a list-of-numbers.
    
    A list-of-PRs is either
     - empty or
     - (cons N L)
         where N is a PR
         and L is a list-of-PRs.
    
    Now abstract over the two:
    			    A list-of-XYZs is either
    			     - empty or
    			     - (cons N L)
    				 where N is a XYZ
    				 and L is a list-of-XYZs.
    
    We will use (listof XYZ) to write down lists in the future.




Matthias Felleisen This page was generated on Fri Apr 9 09:17:38 CDT 1999.