you can define methods on make-load-form to do just this. you still have to traverse the slots by hand but thats not so bad since you can use the MOP functions to do this. your code would need special knowlege of which slots to recusively process but thats it.

(import '(sb-pcl:slot-definition-initargs
          sb-pcl:slot-definition-initform
          sb-pcl:slot-definition-name
          sb-pcl:class-direct-slots
          sb-pcl:class-slots
          sb-pcl:class-direct-superclasses
          sb-mop:class-direct-subclasses
          )

(defmethod make-load-form ((obj foobar) )
  (let (inits ())
    (setf inits (loop for slot in (class-slots (class-of obj))
                      for name = (slot-definition-name slot)
                      if (slot-boundp obj name)
                        collect (car (slot-definition-initarg slot)
                        and collect (slot-value obj name)))
    `(make-instance (quote ,(class-name (class-of obj)))
                     ,@ inits)))



One thing that has cropped up as I am trying to resurrect my PICACS code in SBCL is that the code I developed to save objects (and any subobjects) to disk is broken, because of all of the CCL calls I used.

I there a standard LISP way of writing objects to disk (and later restoring them), including all subobjects?

As it was, I solved it three years ago by writing code that determines the slots of any object, traverses the whole object and subobject tree of a given object and writes out to disk the code needed to recreate the objects.

Surely there is a better way, and one that doesn't require system- specific calls (?) -- and three days of hunting poor documentation to figure out how to translate my CCL implementation to SBCL?

Cheers,
-=Bret


_______________________________________________
Cmdist mailing list
[email protected]
http://ccrma-mail.stanford.edu/mailman/listinfo/cmdist

Reply via email to