Let's have a look at a simple object in Scheme. This is simple message passing with a closure that dispatches on its first argument:
(define (make-simple-object) (let ((my-var 0)) (define init (lambda () (set! my-var 0) my-var)) (define my-add (lambda (x) (set! my-var (+ my-var x)) my-var)) (define get-my-var (lambda () my-var)) (define my-display (lambda () (newline) (display "My Var is:") (display my-var) (newline))) (lambda (message . args) (apply (case message ((init) init) ((my-add) my-add) ((my-display) my-display) ((get-my-var) get-my-var) (else (error "Unknown Method!"))) args)))) (define a (make-simple-object)) (define b (make-simple-object)) (a 'init) => 0 (b 'init) => 0 (a 'my-add 3) => 3 (a 'my-add 4) => 7 (a 'get-my-var) => 7 (b 'get-my-var) => 0 (a 'my-display) => My Var is: 7
You can get a bit more serious than this, too, and roll-your-own-object-system...