[an error occurred while processing this directive]

Class 15 Notes

Lecture Slides, Suitable For Printing

Notes

(define (make-counter)
   ((lambda (count)
      (lambda ()
        (set! count (+ 1 count))
        count))
   0))
Draw the environment after:
   (define counter (make-counter))
   (counter)









(define (make-counter)
   (let ((count 0))
     (lambda (message)
       (cond ((eq? message 'reset!)  (set! count 0))
	     ((eq? message 'next!)   (set! count (+ 1 count)))
	     ((eq? message 'current) count)
	     (else (error "Unrecognized message"))))))
What is an object?





Why is it useful to package state and procedures together?




(define (make-number n)
  (lambda (message)
    (cond
     ((eq? message 'value) (lambda (self) n))
     ((eq? message 'add) (lambda (self other)
			   (+ (ask self 'value) (ask other 'value))))))))

(define (ask object message . args) (apply (object message) object args))
Inheritance is using the definition of one class to make another class.
(define (make-fraction numer denom)
  (let ((super (make-number #f)))
    (lambda (message)
      (cond
       ((eq? message 'value) (lambda (self) (/ numer denom)))
       ((eq? message 'get-denominator) (lambda (self) denom))
       ((eq? message 'get-numerator) (lambda (self) numer))
       (else (super message))))))


(define (make-fraction numer denom)
    (make-subobject
      (make-number #f)))
      (lambda (message)
      (cond
       ((eq? message 'value) (lambda (self) (/ numer denom)))
       ((eq? message 'get-denominator) (lambda (self) denom))
       ((eq? message 'get-numerator)   (lambda (self) numer))
       (else #f)))))

(define (make-subobject super imp)
   (lambda (message)







    ))
The class fraction inherits from number.
fraction is a subclass of number.
The superclass of fraction is number.

Which of the traced applications are from fraction and which are from number?
> (ask half 'add half)
|(ask # add #)
| (eq? add value)
| #f
| (eq? add get-denominator)
| #f
| (eq? add get-numerator)
| #f
| (eq? add value)
| #f
| (eq? add add)
| #t
| (ask # value)
| |(eq? value value)
| |#t
| 1/2
| (ask # value)
| |(eq? value value)
| |#t
| 1/2
|1
1


If I have seen further it is by standing on the shoulders of giants.
Isaac Newton (on inheritance?)

If I have not seen as far as others, it is because giants were standing on my shoulders.
Hal Abelson (on subtyping?) [an error occurred while processing this directive]