hand-made OO added by mario-goulart on Tue Feb 7 20:57:02 2012

(define (make-object #!key (foo 'foo) (bar 'bar))
  (let* ((foo foo)
         (bar bar)
         (set-foo! (lambda (value) (set! foo value))))
    (lambda (message . args)
      (case message
        ((foo) foo)
        ((bar) bar)
        ((set-foo!)
         (if (null? args)
             (error 'set-foo! "Expected one argument")
             (set-foo! (car args))))
        (else (error "Unknown message."))))))


(define an-object (make-object))
(print (an-object 'foo))
(an-object 'set-foo! 'quux)
(print (an-object 'foo))


(define another-object (make-object foo: 'wat))
(print (another-object 'foo))