(define one-or-two (lambda (first . rest) (cond ((null? rest) (display first) (newline)) ((null? (cdr rest)) (display (car rest)) (newline)) (else (error 'one-or-two "You idiot. You should only call this procedure with one or two parameters. You used more. Are you sure that you understand Scheme? Take German instead."))))) (define sam (let ((characteristics (vector 5 10 "brown" 2000))) (lambda (command) (cond ((eq? command ':describe) (display "Everything you needed to know about Sam Rebelsky but didn't want to ask.") (newline) (display "Sam's mood is ranked at: ") (display (vector-ref characteristics 0)) (newline) (display "Sam's weight is ") (display "none of your damn business.") (newline) (display "Sam has $") (display (/ (vector-ref characteristics 3) 100)) (display " on hand.")) ((eq? command ':feed!) (vector-set! characteristics 0 (min (+ 1 (vector-ref characteristics 0)) 10)) (vector-set! characteristics 1 (+ 1 (vector-ref characteristics 1)))) ((eq? command ':kick!) (display "Ouch!") (newline) (display "Seth didn't really want an A or a B, did he?") (newline) (vector-set! characteristics 0 1)) )))) (define make-person (lambda (name initial-weight eye-color money) (let ((characteristics (vector name 5 initial-weight eye-color money))) (lambda (command) (cond ((eq? command ':describe) (display "Everything you needed to know about ") (display (vector-ref characteristics 0)) (display " but didn't want to ask.") (newline) (display "Mood is ranked at ") (display (vector-ref characteristics 1)) (newline) (display "Weight is ") (display (vector-ref characteristics 2)) (newline) (display "Has $") (display (/ (vector-ref characteristics 4) 100)) (display " on hand.")) ((eq? command ':feed!) (vector-set! characteristics 1 (min (+ 1 (vector-ref characteristics 1)) 10)) (vector-set! characteristics 2 (+ 1 (vector-ref characteristics 2)))) ((eq? command ':kick!) (display "Ouch!") (newline) (display "Seth didn't really want an A or a B, did he?") (newline) (vector-set! characteristics 1 1)) )))))