Skip to content

Commit

Permalink
Moved the meat of the slot-value expander to it's own function, copy-…
Browse files Browse the repository at this point in the history
…instance.

Gone full circle on that one.
  • Loading branch information
smithzvk committed Jul 6, 2011
1 parent 6c7d241 commit e72aee7
Showing 1 changed file with 19 additions and 16 deletions.
35 changes: 19 additions & 16 deletions basic.lisp
Expand Up @@ -10,23 +10,26 @@
`(cons ,new-val (cdr ,val)) ) `(cons ,new-val (cdr ,val)) )


#+closer-mop #+closer-mop
(defun copy-instance (obj)
(let* ((class (class-of obj))
(slots (closer-mop:class-slots class))
(new-instance (make-instance class)))
(loop for slot in slots do
(cond ((slot-boundp obj (closer-mop:slot-definition-name slot))
(setf (slot-value new-instance (closer-mop:slot-definition-name
slot ))
(slot-value obj (closer-mop:slot-definition-name slot)) ))
(t (slot-makunbound new-instance
(closer-mop:slot-definition-name slot) ))))
new-instance ))
#-closer-mop
(defun copy-instance (obj)
(error "Sorry, I need Closer-MOP to Modf classes.") )

(define-modf-expander slot-value 1 (expr val new-val) (define-modf-expander slot-value 1 (expr val new-val)
(with-gensyms (slot-name class slots new-instance slot) `(let ((new (copy-instance ,val)))
`(let* ((,slot-name ,(third expr)) (setf (slot-value new ,(third expr)) ,new-val)
(,class (class-of ,val)) new ))
(,slots (closer-mop:class-slots ,class))
(,new-instance (make-instance ,class)))
(loop for ,slot in ,slots do
(cond ((eql ,slot-name (closer-mop:slot-definition-name ,slot))
(setf (slot-value ,new-instance ,slot-name)
,new-val ))
((slot-boundp ,val (closer-mop:slot-definition-name ,slot))
(setf (slot-value ,new-instance (closer-mop:slot-definition-name
,slot ))
(slot-value ,val (closer-mop:slot-definition-name ,slot)) ))
(t (slot-makunbound ,new-instance
(closer-mop:slot-definition-name ,slot) ))))
,new-instance )))


(define-modf-method pathname-directory 1 (new-val path) (define-modf-method pathname-directory 1 (new-val path)
(make-pathname :directory new-val :defaults path) ) (make-pathname :directory new-val :defaults path) )
Expand Down

0 comments on commit e72aee7

Please sign in to comment.