[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Save-Object
- To: info-mcl@ministry.cambridge.apple.com
- Subject: Re: Save-Object
- From: jona@ils.nwu.edu (Kemi Jona)
- Date: Fri, 17 Dec 1993 14:32:30 -0600
- Followup-to: comp.lang.lisp.mcl
- Newsgroups: comp.lang.lisp.mcl
- Organization: Institute for the Learning Sciences
- References: <2eq8f0$ore@genome.wi.mit.edu>
In article <2eq8f0$ore@genome.wi.mit.edu>, joe@genome.wi.mit.edu (Steve
Lincoln's Evil Twin) wrote:
> I've been trying to get save-object (the version in the lisp-utilities
> repository, not the rather dated version on cambridge.apple.com) working
> in MCL 2.0.1.
> Before I start thrashing around with it, does anyone have a plug-n-play
> working version of save-object.lisp they can send me? Is there a more recent
> version than the above I should have?
Here's a quick and dirty version that uses the #. reader macro and fasl
files.
;;;-----------------------------------------------------------------------------
;;;
;;; My save object code
;;;
;;; Written by Kemi Jona, jona@ils.nwu.edu, 9/92
;;;
;;;-----------------------------------------------------------------------------
(defvar *db-output* nil
"Variable used in SAVE-OBJECT")
(defvar *db-input* nil
"Variable used in SAVE-OBJECT")
(defun save-object (object filename &key (package *package*))
"(object filename &key (package *package*))
Saves OBJECT to a compiled file named FILENAME. All objects referenced
must have a MAKE-LOAD-FORM method defined. Use the function
LOAD-OBJECT to restore the object."
(declare (special *db-output*))
(let* ((full-filename (translate-logical-pathname filename))
(tempfile (merge-pathnames "tempfile" (directory-namestring
full-filename)))
(*.fasl-pathname* ""))
(unwind-protect
(let ((*package* (find-package package)))
(setq *db-output* object)
(with-open-file (outstream tempfile :direction :output
:if-exists :overwrite
:if-does-not-exist :create)
(format outstream "(in-package ~S)~%" (package-name
(find-package package)))
(format outstream "(setq *db-input* '#.*db-output*)~%"))
(compile-file tempfile :output-file filename))
(setq *db-output* nil)
(delete-file tempfile))
(probe-file full-filename)))
;;; returns the object saved in filename
(defun load-object (filename)
"(filename)
Returns the object saved to FILENAME by a call to SAVE-OBJECT."
(declare (special *db-input*))
(if (probe-file filename)
(unwind-protect
(progn
(load filename)
*db-input*)
(setq *db-input* nil))
(error "File not found: ~S~%" filename)))
#| try this as a standard make-load-form template. see CLtL p659 for
more info.
(defmethod make-load-form ((obj your-object-class))
(make-load-form-saving-slots obj))
Example 1: Saving lists
(let ((foo '(a b c d e)))
(declare (ignore-if-unused foo))
(save-object foo "save foo"))
(print (load-object "save foo"))
(delete-file "save foo")
Example 2: Saving CLOS objects
(defclass test-class ()
((slot1 :initform 'hello)
(slot2 :initform 'goodbye)))
(defmethod make-load-form ((obj test-class))
(make-load-form-saving-slots obj))
(setq test (make-instance 'test-class))
(save-object test "save test")
(setq restored-test (load-object "save test"))
(format t "~&Original test~%")
(describe test)
(format t "~2%Restored test~%")
(describe restored-test)
(eq test restored-test)
(delete-file "save test")
|#
--Kemi
------------------------------------------------------------
Kemi Jona jona@ils.nwu.edu
Institute for the Learning Sciences, Northwestern University
1890 Maple Ave., Rm. 328, Evanston, IL 60201
(708) 467-1969 or 491-3500 FAX: (708) 491-5258
- References:
- Save-Object
- From: joe@genome.wi.mit.edu (Steve Lincoln's Evil Twin)