[an error occurred while processing this directive]
(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.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]