CLOS woes

"lcluke" <[email protected]> Wed, 07 May 2003 07:35:35 -0000
Newsgroups gmane.lisp.corman
Message-ID <[email protected]>
I am experiencing a slight problem with CLOS.

I create 2 objects, 'an-object-1' and  'an-object-2'. However when I 
set the value of the variable 'position' in 'an-object-1', it is 
also set for 'an-object-2' (even though these are two different 
objects). It seems that 'position' is acting like a class-wide 
variable and not an instance variable.

Could someone please run my code and verify these results?

-Luke

******************* Begin, program run ********************
Before variables are set...
an-object-1 = #<Object #xCBAB40>, id = OBJ-1, position = (x=0.0, 
y=0.0, z=0.0)
After variables are set...
an-object-1 = #<Object #xCBAB40>, id = OBJ-1, position = (x=0.0, y=-
5.0, z=-20.0)
(get-object *scene* 'obj-1) = #<Object #xCBAB40>, id = OBJ-1, 
position = (x=0.0, y=-5.0, z=-20.0)

Before variables are set...
an-object-2 = #<Object #xCC8580>, id = OBJ-2, position = (x=0.0, y=-
5.0, z=-20.0)
After variables are set...
an-object-2 = #<Object #xCC8580>, id = OBJ-2, position = (x=0.0, 
y=5.0, z=-20.0)
(get-object *scene* 'obj-2) = #<Object #xCC8580>, id = OBJ-2, 
position = (x=0.0, y=5.0, z=-20.0)

Compare an-object-1 in *scene* to an-object-2 in *scene*
Object: OBJ-1 - position: x=0.0, y=5.0, z=-20.0
Object: OBJ-2 - Translate: x=0.0, y=5.0, z=-20.0
NIL
******************* End, program run ********************

;;; Define classes
;;;
(defclass Object ()
    (
        (id             :accessor id            ; object identifier
                        :initform nil
                        :initarg :id)
        (position       :accessor position
                        :initform '(0.0 0.0 0.0))))    ; vector 
containing x y z
(defclass Scene ()
    (
        (objects    :accessor   objects
                    :initform   (make-hash-table)))) ; a hash-table 
of objects in the scene

;;;
;;; End classes

;;; Generic methods
;;;
(defmethod add-object ((sc scene) (obj object))
    (setf (gethash (id obj) (objects sc)) obj))

(defmethod get-object ((sc scene) id)
    (gethash id (objects sc)))

(defun new-object (identifier)
    (values (make-instance 'object :id identifier)))

(defmethod set-position ((self object) x y z)
    (setf (nth 0 (position self)) x)
    (setf (nth 1 (position self)) y)
    (setf (nth 2 (position self)) z))

(defmethod get-position-x ((self object))
        (nth 0 (position self)))

(defmethod get-position-y ((self object))
        (nth 1 (position self)))

(defmethod get-position-z ((self object))
        (nth 2 (position self)))

;;;
;;; End Generic methods
(let (
        (an-object-1 (new-object 'obj-1))
        (an-object-2 (new-object 'obj-2)))
    
    (setf *scene* (make-instance 'scene))
    
    ;; Object 1
    (format t "Before variables are set...~%")
    (format t "an-object-1 = ~A, id = ~A, position = (x=~A, y=~A, 
z=~A)~%"
        an-object-1
        (id an-object-1)
        (get-position-x an-object-1)
        (get-position-y an-object-1)
        (get-position-z an-object-1))
    
    (set-position an-object-1 0.0 -5.0 -20.0)
    (add-object *scene* an-object-1)
    
    (format t "After variables are set...~%")
    (format t "an-object-1 = ~A, id = ~A, position = (x=~A, y=~A, 
z=~A)~%"
        an-object-1
        (id an-object-1)
        (get-position-x an-object-1)
        (get-position-y an-object-1)
        (get-position-z an-object-1))
    (format t "(get-object *scene* 'obj-1) = ~A, id = ~A, position = 
(x=~A, y=~A, z=~A)~%"
        (get-object *scene* 'obj-1)
        (id (get-object *scene* 'obj-1))
        (get-position-x (get-object *scene* 'obj-1))
        (get-position-y (get-object *scene* 'obj-1))
        (get-position-z (get-object *scene* 'obj-1)))

    ;; Object 2
    (format t "~%Before variables are set...~%")
    (format t "an-object-2 = ~A, id = ~A, position = (x=~A, y=~A, 
z=~A)~%"
        an-object-2
        (id an-object-2)
        (get-position-x an-object-2)
        (get-position-y an-object-2)
        (get-position-z an-object-2))
    
    (set-position an-object-2 0.0 5.0 -20.0)
    (add-object *scene* an-object-2)
    
    (format t "After variables are set...~%")
    (format t "an-object-2 = ~A, id = ~A, position = (x=~A, y=~A, 
z=~A)~%"
        an-object-2
        (id an-object-2)
        (get-position-x an-object-2)
        (get-position-y an-object-2)
        (get-position-z an-object-2))
    (format t "(get-object *scene* 'obj-2) = ~A, id = ~A, position = 
(x=~A, y=~A, z=~A)~%"
        (get-object *scene* 'obj-2)
        (id (get-object *scene* 'obj-2))
        (get-position-x (get-object *scene* 'obj-2))
        (get-position-y (get-object *scene* 'obj-2))
        (get-position-z (get-object *scene* 'obj-2)))
        
    (format t "~%Compare an-object-1 in *scene* to an-object-2 in 
*scene*~%")
    
    (format t "Object: ~A - position: x=~A, y=~A, z=~A~%"
        (id (get-object *scene* 'obj-1))
        (get-position-x (get-object *scene* 'obj-1))
        (get-position-y (get-object *scene* 'obj-1))
        (get-position-z (get-object *scene* 'obj-1)))
            
    (format t "Object: ~A - Translate: x=~A, y=~A, z=~A~%"
        (id (get-object *scene* 'obj-2))
        (get-position-x (get-object *scene* 'obj-2))
        (get-position-y (get-object *scene* 'obj-2))
        (get-position-z (get-object *scene* 'obj-2))))


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Make Money Online Auctions! Make $500.00 or We Will Give You Thirty Dollars for Trying!
http://us.click.yahoo.com/KXUxcA/fNtFAA/uetFAA/SyjtlB/TM
---------------------------------------------------------------------~->

To unsubscribe from this group, send an email to:
[email protected]

 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/