(load "utils.scm") (define p1% (class object% (firstname lastname) (private (fname firstname) (lname lastname)) (public (last-name (lambda () lname)) (p1? (lambda () (is-a? this p1%))) (first-name (lambda () fname)) (set-last-name! (lambda (new-name) (set! lname new-name))) (print-name (lambda () (display "First name: ") (display fname) (display " ") (display "Last name: ") (display lname) (newline))) (dummy 1) (sequence (super-init))))) (define (use-p1%) (let ((me (make-object p1% "foo" "bar"))) (send me print-name) (send me set-last-name! "someone") (send me print-name) (display (ivar me dummy)) (newline) ((ivar me print-name)) (values))) (define p2% (class p1% (first-name last-name an-address an-email) (rename (super-dummy dummy)) (sequence (super-init first-name last-name)) (public (address an-address) (email an-email) (set-email! (lambda (new-address) (set! email new-address))) (p2? (lambda () (is-a? this p2%))) (build-from-file (lambda (file-name) (with-input-from-file file-name (lambda () (let ((ll (read))) (send this build-from-list ll)))))) (build-from-list (lambda (l) (make-object p2% (list-ref l 0) (list-ref l 1) (list-ref l 2) (list-ref l 3)))) (write-to-file (lambda (file-name mode) (with-output-to-file file-name (lambda () (let ((ll (list (send this first-name) (send this last-name) address email))) (write ll))) mode))) (set-address! (lambda (new-address) (set! address new-address)))) (override (dummy (+ super-dummy 2))))) ;; show-generics (define p-dummy (make-generic/proc p1% 'dummy)) (define (use-of-generic-functions) (let ((p1 (make-object p1% "foo" "bar")) (p2 (make-object p2% "foo" "bar" "Footown" "foo@Footown"))) (display "p1% dummy = ") (display (p-dummy p1)) (display "; p2% dummy = ") (display (p-dummy p2)) (newline) (values)))