From: <jm...@st...> - 2000-08-12 01:29:19
|
I recently coded up pretty much what's contained in cllib/closio.lisp. Then I discovered closio. I thought, gee, I'm already using clocc, I'll just throw my code away and use closio. Here's what I found with acl 5.0.1 on solaris. (1) My slot initargs are keyword symbols, so merely outputing slot names as the closio print-object does didn't work with read-object. The following works for me. (defmethod print-object ((obj standard-object) (out stream)) (if *print-readably* (let ((cl (class-of obj))) (format out "#[~s" (class-name cl)) (dolist (slot (class-slots cl)) (when (slot-boundp obj (slot-definition-name slot)) (format out " ~w ~w" (first (slot-definition-initargs slot)) (slot-value obj (slot-definition-name slot))))) (write-string "]" out)) (call-next-method))) The closio print-object calls port:clos-slot-list which returns a list of mere slot names. This routine bends over backwards to mask differences between a bunch of clossy environments--a road I'm not inclined to travel. (2) Shadowing print-object in the cllib defpackage is an option. On acl5 one gets: ; While compiling (:TOP-LEVEL-FORM "cdae08895.cl" 156) in /home/jmadams/tmp/cdae08895.cl: Warning: Compiling a DEFMETHOD for the name PRINT-OBJECT with specializers (STANDARD-OBJECT STREAM). This name is in the COMMON-LISP package and modifying the generic-function defined on it will be a violation for portable programs. The package COMMON-LISP has EXCL:PACKAGE-DEFINITION-LOCK set, which causes the system to signal this violation. -- John M. Adams |
From: Sam S. <sd...@gn...> - 2000-08-12 18:41:03
|
> * In message <xao...@an...> > * On the subject of "cllib/closio print-object and :initargs" > * Sent on 11 Aug 2000 21:28:31 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > (1) My slot initargs are keyword symbols, so merely outputing slot > names as the closio print-object does didn't work with read-object. > The following works for me. > > (format out " ~w ~w" I used " ~s ~s" here. what error are you getting? What out put do you get, and what do you need? > The closio print-object calls port:clos-slot-list which returns a list > of mere slot names. This routine bends over backwards to mask > differences between a bunch of clossy environments--a road I'm not > inclined to travel. what's your problem? you get portability for free - why not? > (2) Shadowing print-object in the cllib defpackage is an option. not really. then I won't be able to use default methods - like for structures et al. > On acl5 one gets: > > ; While compiling (:TOP-LEVEL-FORM "cdae08895.cl" 156) in /home/jmadams/tmp/cdae08895.cl: > Warning: Compiling a DEFMETHOD for the name PRINT-OBJECT with specializers > (STANDARD-OBJECT STREAM). This name is in the COMMON-LISP package and modifying the > generic-function defined on it will be a violation for portable programs. The package > COMMON-LISP has EXCL:PACKAGE-DEFINITION-LOCK set, which causes the system to signal > this violation. I believe you can cajole ACL into accepting the code, possibly by setting a couple of variables or some such. E.g., you might try (setf (excl:package-definition-lock (find-package :cl)) nil) I might look into this myself... Thanks for trying CLLIB. -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. Never let your schooling interfere with your education. |
From: <jm...@st...> - 2000-08-12 19:40:36
|
Sam Steingold <sd...@gn...> writes: > > * In message <xao...@an...> > > * On the subject of "cllib/closio print-object and :initargs" > > * Sent on 11 Aug 2000 21:28:31 -0400 > > * Honorable jm...@st... (John M. Adams) writes: > > > > (1) My slot initargs are keyword symbols, so merely outputing slot > > names as the closio print-object does didn't work with read-object. > > The following works for me. > > > > (format out " ~w ~w" > > I used " ~s ~s" here. > what error are you getting? > What out put do you get, and what do you need? As I recall, I wanted *print-escape* t to print keyword symbols with colons. With closio, read-object was doing this (make-instance 'blah x 1 y 2 z 3) whereas I think I need (make-instance 'blah :x 1 :y 2 :z 3) The closio approach is problematic because it tries to use slot-names instead of actual initarg specs to construct the make-instance form. > > The closio print-object calls port:clos-slot-list which returns a list > > of mere slot names. This routine bends over backwards to mask > > differences between a bunch of clossy environments--a road I'm not > > inclined to travel. > > what's your problem? > you get portability for free - why not? That's just my excuse for not sending an actual patch. I didn't think I could fix it to my satisfaction and adhere to the apparent spirit of the existing implementation. > Thanks for trying CLLIB. I like it. Thanks for making it available. -- John M. Adams |
From: Sam S. <sd...@gn...> - 2000-08-14 16:26:06
|
> * In message <xao...@an...> > * On the subject of "Re: cllib/closio print-object and :initargs" > * Sent on 12 Aug 2000 15:39:57 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > The closio approach is problematic because it tries to use slot-names > instead of actual initarg specs to construct the make-instance form. fixed - please get PORT and CLLIB and try closio again. -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. There's always free cheese in a mousetrap. |
From: <jm...@st...> - 2000-08-16 00:29:24
|
Sam Steingold <sd...@gn...> writes: > > * In message <xao...@an...> > > * On the subject of "Re: cllib/closio print-object and :initargs" > > * Sent on 12 Aug 2000 15:39:57 -0400 > > * Honorable jm...@st... (John M. Adams) writes: > > > > The closio approach is problematic because it tries to use slot-names > > instead of actual initarg specs to construct the make-instance form. > > fixed - please get PORT and CLLIB and try closio again. Works. Thanks alot. Now I get to delete some code. Love that. -- John M. Adams |
From: <jm...@st...> - 2000-08-18 06:03:02
|
Sam Steingold <sd...@gn...> writes: > > * In message <xao...@an...> > > * On the subject of "Re: cllib/closio print-object and :initargs" > > * Sent on 12 Aug 2000 15:39:57 -0400 > > * Honorable jm...@st... (John M. Adams) writes: > > > > The closio approach is problematic because it tries to use slot-names > > instead of actual initarg specs to construct the make-instance form. > > fixed - please get PORT and CLLIB and try closio again. I see that there is now a macro, slot-one-initarg which, if no slot initargs exist, acts as if they do exist and are named after the slots. So we've gone from ignoring initargs, to pretending they exist when they aren't there. :-) Would it be better to do nothing instead? Consider a case where the object to be written has a slot value for which the appropriate read/write behavior is not defined and is not otherwise useful. For example, I have a class with a hash-table slot. I don't need the hash-table to be stored. I just want the initform to be evaluated when the object is read back in. I suggest that slot-one-initarg should return nil when it finds no initargs and the closio print-object should do nothing when init is nil. I didn't check to see what else might be depending on the slot-one-initarg behavior, but something like this is what I had in mind. Index: port/sys.lisp =================================================================== RCS file: /cvsroot/clocc/clocc/src/port/sys.lisp,v retrieving revision 1.19 diff -u -r1.19 sys.lisp --- port/sys.lisp 2000/08/14 19:25:05 1.19 +++ port/sys.lisp 2000/08/18 05:54:59 @@ -112,7 +112,7 @@ #+lispworks `(hcl::slot-definition-initargs ,slot) #+lucid `(clos:slot-definition-initargs ,slot)) (slot-one-initarg (slot) - `(or (car (slot-initargs ,slot)) (slot-name ,slot))) + `(car (slot-initargs ,slot))) (slot-alloc (slot) #+allegro `(clos::slotd-allocation ,slot) #+clisp `(clos::slotdef-allocation ,slot) Index: cllib/closio.lisp =================================================================== RCS file: /cvsroot/clocc/clocc/src/cllib/closio.lisp,v retrieving revision 1.13 diff -u -r1.13 closio.lisp --- cllib/closio.lisp 2000/08/14 19:31:46 1.13 +++ cllib/closio.lisp 2000/08/18 05:54:59 @@ -68,7 +68,7 @@ :initially (format out "#[~s" (class-name cl)) :for slot :in (class-slot-list cl nil) :and init :in (class-slot-initargs cl nil) - :when (slot-boundp obj slot) + :when (and init (slot-boundp obj slot)) :do (format out " ~s ~s" init (slot-value obj slot)) :finally (write-string "]" out)) (call-next-method))) -- John M. Adams |
From: Sam S. <sd...@gn...> - 2000-08-18 20:17:39
|
> * In message <xao...@an...> > * On the subject of "Re: cllib/closio print-object and :initargs" > * Sent on 18 Aug 2000 02:02:40 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > I see that there is now a macro, slot-one-initarg which, if no slot > initargs exist, acts as if they do exist and are named after the > slots. So we've gone from ignoring initargs, to pretending they exist > when they aren't there. :-) with your patch, this class: (defclass z () (a b c)) will never print readably. I suspect that what you want is something like `make-load-form'. CLISP lacks it, unfortunately. Please see cllib/date.lisp for another suggestion (class-allocated slot with a list of printable slots). -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. C combines the power of assembler with the portability of assembler. |
From: <jm...@st...> - 2000-08-18 22:07:17
|
Sam Steingold <sd...@gn...> writes: > > * In message <xao...@an...> > > * On the subject of "Re: cllib/closio print-object and :initargs" > > * Sent on 18 Aug 2000 02:02:40 -0400 > > * Honorable jm...@st... (John M. Adams) writes: > > > > I see that there is now a macro, slot-one-initarg which, if no slot > > initargs exist, acts as if they do exist and are named after the > > slots. So we've gone from ignoring initargs, to pretending they exist > > when they aren't there. :-) > > with your patch, this class: > > (defclass z () (a b c)) > > will never print readably. Doesn't it? It prints as #[z] and reading yields default values for a b c. To preserve the slot values, you write initargs. That seems like a very sensible and straightforward protocol to me. > I suspect that what you want is something like `make-load-form'. > CLISP lacks it, unfortunately. > > Please see cllib/date.lisp for another suggestion (class-allocated slot > with a list of printable slots). OK, but what I really want is to have closio ignore slots without initargs. Thanks for the reply. -- John M. Adams |
From: Sam S. <sd...@gn...> - 2000-08-19 03:16:14
|
> * In message <xao...@an...> > * On the subject of "Re: cllib/closio print-object and :initargs" > * Sent on 18 Aug 2000 18:06:43 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > Sam Steingold <sd...@gn...> writes: > > > with your patch, this class: > > > > (defclass z () (a b c)) > > > > will never print readably. > > Doesn't it? It prints as #[z] and reading yields default values for a > b c. To preserve the slot values, you write initargs. That seems > like a very sensible and straightforward protocol to me. Try printing (make-instance 'z 'a 1 'b 2 'c 3) You see, the slot name is the default initarg. Please see CLHS. > OK, but what I really want is to have closio ignore slots without > initargs. closio.lisp provides readable printing of CLOS objects. you want an object (make-instance 'z 'a 1 'b 2 'c 3) to be printed as #[z] - thus read as (make-instance 'z) which is not #'equal to the original object. You probably want to investigate :after methods for `initialize-object' or something similar. Did you look at date.lisp, as I suggested? -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. Isn't "Microsoft Works" an advertisement lie? |
From: <jm...@st...> - 2000-08-19 15:09:15
|
Sam Steingold <sd...@gn...> writes: > > * In message <xao...@an...> > > * On the subject of "Re: cllib/closio print-object and :initargs" > > * Sent on 18 Aug 2000 18:06:43 -0400 > > * Honorable jm...@st... (John M. Adams) writes: > > > > Sam Steingold <sd...@gn...> writes: > > > > > with your patch, this class: > > > > > > (defclass z () (a b c)) > > > > > > will never print readably. > > > > Doesn't it? It prints as #[z] and reading yields default values for a > > b c. To preserve the slot values, you write initargs. That seems > > like a very sensible and straightforward protocol to me. > > Try printing (make-instance 'z 'a 1 'b 2 'c 3) > > You see, the slot name is the default initarg. > Please see CLHS. Where is it specified that slot-names are implicitly initargs? I certainly didn't get that from my reading. In acl5, ET(222): (defclass z () (a b c)) #<STANDARD-CLASS Z> ET(223): (make-instance 'z 'a 1 'b 2 'c 3) Error: C B A are invalid initargs to make-instance of class #<STANDARD-CLASS Z>. There are no valid initargs. [condition type: PROGRAM-ERROR] So you see, at least with this lisp, the current closio is unable to read such a z, let alone produce something equal. With my patch such a z can be read. It might not be equal to the original but it *will* be z-equivalent in a way that the author of z can control via initarg declarations. So what's the problem? I guess the crux of the debate is whether slot-names are implicitly initargs. My lisp (acl5) doesn't support that, whereas you claim the spec does. Another way to implement read-object would be to call make-instance with only those initargs that are actually reported to be initargs via slot-definition-initargs and then use (setf (slot-value i s)) forms to assign the remaining slots. I happen to think that ignoring slots without initargs is the right thing to do. > You probably want to investigate :after methods for `initialize-object' > or something similar. Did you look at date.lisp, as I suggested? I saw the printable-slots slot. -- John M. Adams |
From: Sam S. <sd...@gn...> - 2000-08-19 18:20:18
|
> * In message <xao...@an...> > * On the subject of "Re: cllib/closio print-object and :initargs" > * Sent on 19 Aug 2000 11:08:56 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > Where is it specified that slot-names are implicitly initargs? looks like you are right. sorry. I will think about it. -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. Trespassers will be shot. Survivors will be SHOT AGAIN! |
From: Sam S. <sd...@gn...> - 2000-08-19 22:17:06
|
> * In message <xao...@an...> > * On the subject of "Re: cllib/closio print-object and :initargs" > * Sent on 19 Aug 2000 11:08:56 -0400 > * Honorable jm...@st... (John M. Adams) writes: > > I happen to think that ignoring slots without initargs is the right > thing to do. I happen to think that readable printing is supposed to allow (equal object (read-from-string (prin1-to-string object))) what you suggest fails this. Nevertheless, I implemented what you wanted. Please set *closio-method* to :initarg to get what you want and to :slot-name to get really readable printing. -- Sam Steingold (http://www.podval.org/~sds) Micros**t is not the answer. Micros**t is a question, and the answer is Linux, (http://www.linux.org) the choice of the GNU (http://www.gnu.org) generation. When we break the law, they fine us, when we comply, they tax us. |
From: <jm...@st...> - 2000-08-23 03:42:56
|
Sam Steingold <sd...@gn...> writes: > > Please set *closio-method* to :initarg to get what you want and to > :slot-name to get really readable printing. It works. Thanks, Sam. -- John M. Adams |