(define pi 3.14159265358979323846264338) (define circle (lambda (r) (define name "") (lambda (msg) (cond ((eq? 'radius msg) r) ((eq? 'twice msg) (set! p (* p 2))) ((eq? 'size msg) (* r r pi)) ((eq? 'length msg) (* 2 pi r)) ((eq? 'name msg) name) ((list? msg) (cond ((eq? 'name (car msg)) (set! name (cadr msg))))))))) (define triangle (lambda (a b c) (define heron (lambda (x y z) ((lambda (x y z s) (sqrt (* s (- s x) (- s y) (- s z)))) x y z (/ (+ x y z) 2)))) (lambda (msg) (cond ((eq? 'size msg) (heron a b c)) ((eq? 'length msg) (+ a b c)))))) (define each-send (lambda (lst msg) (if (null? lst) () (cons ((car lst) msg) (each-send (cdr lst) msg))))) (define c1 (circle 2)) (define c2 (circle 3)) (define t1 (triangle 3 4 5)) (define t2 (triangle 1 1 (sqrt 2))) ;(collect (list c1 c2 t1 t2) (lambda (one) (one 'size))) (each-send (list c1 c2 t1 t2) 'size) (define object-list (lambda (lst) (lambda (msg args) (cond ((eq? 'add msg) (set! lst (cons args lst))) ((eq? 'show msg) (write lst))))))