(define make-account (lambda args (let ((balance (if (null? args) 100 (car args)))) (lambda (message) (cond ((eq? message 'withdraw) (lambda (amount) (if (<= amount balance) (set! balance (- balance amount))) balance)) ((eq? message 'deposit) (lambda (amount) (set! balance (+ balance amount)) balance)) (else (no-method 'account))))))) (define make-speaker (lambda () (lambda (message) (cond ((eq? message 'say) (lambda (self stuff) (display stuff) (newline))) (else (no-method 'speaker)))))) (define make-lecturer (lambda () (let ((speaker (make-speaker))) (lambda (message) (cond ((eq? message 'lecture) (lambda (self stuff) (ask self 'say stuff) (ask self 'say '(abstraction abstraction abstraction)))) (else (get-method speaker message))))))) (define make-arrogant-lecturer (lambda () (let ((lecturer (make-lecturer))) (lambda (message) (cond ((eq? message 'say) (lambda (self stuff) (ask lecturer 'say (append '(it is obvious that) stuff)))) (else (get-method lecturer message)))))))