# OBJECT an example object -- a container
[hear] (define container
         (lambda (x)
           (let ((contents (make-cell (vector))))
              (lambda (self msg)
            (cond ((= (msg) container) (self))
                  ((= (msg) inventory) (get! (contents)))
                  ((= (msg) add)
               (lambda (x)
                 (if (not (element (x) (get! (contents))))
                     (set! (contents) (prepend (x) (get! (contents))))
                  ((= (msg) remove)
               (lambda (x)
                 (set! (contents) (remove-element (x) (get! (contents))))))
                  ((= (msg) =)
               (lambda ((c container))
                 (set= (self inventory) (c inventory))))

       # Can pass anything to container function to create an object
       # Should eventually use a consistent protocol for all objects,
       # but all this stuff is still in flux
[hear] (define pocket (container new));

[hear] (pocket add 77);

[hear] (pocket add 88);

[hear] (pocket add 99);

[hear] (set= (pocket inventory) (vector 77 88 99));

[hear] (pocket remove 88);

[hear] (set= (pocket inventory) (vector 77 99));

[hear] (define pocket2 (container new));

[hear] (pocket2 add 77);

[hear] (pocket2 add 99);

[hear] (pocket2 = (pocket));