[cells-devel] Re: It's not a feature, it's a bug

Kenny Tilton ktilton at nyc.rr.com
Fri Nov 7 03:49:16 UTC 2003



Thomas F. Burdick wrote:

>Kenny Tilton writes:
> > Turns out I /do/ try to reset an ephemeral initialized to (CV <not 
> > nil>), but I only reset the cached value slot of the cell, not the 
> > slot-value per se. And the slot-value is the place the accessor looks 
> > for a value. The cache is just used for other stuff. Ah, the hazards of 
> > redundant representation.
>
>Writing a simple KR<-->CLOS bridge was easy, but not subtly screwing
>up the duplicated information was kind of a headache, so I can sympathize.
>
> > Anyway, I think we are agreeing to let ephemeral + (CV <whatever>) 
> > signify that <whatever> is the value to revert to after a later 
> > ephemeral datachange for such a slot. Hmmm, let me thnk about this. I 
> > actually saw this bug and might have it in a do-list somewhere. I think 
> > it came up because I wanted  a non-nil initial value for a nil-based 
> > ephemeral slot at make-instance-time.
>
>Yep, we're in agreement.  This would be very useful for ephemeral
>slots that take on numeric values, and for interacting well with type
>declarations.  In SBCL, declarations = assertions (CMUCL too, but SBCL
>takes it more seriously), so you can do something like:
>
>  (defclass foo () ((a :accessor foo-a :type fixnum)))
>
>and if you try to set an A slot to something other than a fixnum,
>you'll get a runtime error. 
>
Good lord. Do they know CL is short for Common Lisp? Tell me they get 
huge runtime performance benefits from this sacrilege.

Actually, there is a problem here. Currently Cell structures land in the 
slot during make-instance (when I had a MOP-based implementation I 
shunted Cells bound for a slot over to the .cells internals slot before 
they ever got to the slot, by placing an around method on (setf 
slot-value-using-class)). Possibly I can do the same with an around meth 
on shared-initialize, but till then SBCL will likely not be happy with a 
Cell in a slot typed numeric.

Well, we'll put this in the hopper, but I propose we give higher 
priority to me documenting the system and getting Cello going. And I 
think I do want to make the resumed base value (what /do/ we call that?) 
of an ephemeral a distinct attribute, so as not to shadow the semantics 
of an instance being initialized with an ephemeral slot initialized, 
say, (CV 2) with baseline value zero.

> Plus, you get compile-time warnings if
>Python's type inference shows that A could be set to a non-fixnum.
>
>One problem with Cell-as-is on SBCL, is that the type checking only
>happens when you use the accessor function, not SLOT-VALUE.  This is
>probably best considered a bug in SBCL's PCL, but it has the following
>unfortunate result:
>
>  * (defmodel foo ()
>      ((x :initform (cv 0) :accessor get-x :type fixnum)
>       (10x :initform (c? (* 10 (get-x self))) :accessor get-10x :type fixnum)))
>  STYLE-WARNING: redefining SHARED-INITIALIZE :AFTER (FOO T) in DEFMETHOD
>
Hey, SBCL is creating an after method on shared-initialize?

>  STYLE-WARNING: redefining GET-X (FOO) in DEFMETHOD
>  STYLE-WARNING: redefining (SETF GET-X) (T FOO) in DEFMETHOD
>  STYLE-WARNING: redefining GET-10X (FOO) in DEFMETHOD
>  STYLE-WARNING: redefining (SETF GET-10X) (T FOO) in DEFMETHOD
>
<heh-heh> I keep wondering my I do not get "get-10x defined twice in 
foo.lisp" et al, but I do not.

>  
>  #<STANDARD-CLASS FOO>
>  * (setf >>foo (make-instance 'foo))
>  
>  FOO
>  * (get-10x >>foo)
>  
>  0
>  * (setf (get-x >>foo) most-positive-fixnum)
>  
>  536870911
>  * (get-10x >>foo)
>  
>  5368709110
>  * (typep * 'fixnum)
>  
>  NIL
>  
>
Gee, what /is/ the type?

>In reverse order of simplicity, the best way to solve this would be to
>fix SBCL; 
>
Have you asked the SBCL crowd whether they are set on slot-value being 
type-ignorant?

>the second best way would be to either have Cells use
>:around methods, instead of redefining the primary methods, then
>invoke the proper next-method machinery 
>
That scares me.in the abstract, tho I cannot point to any evil 
consequence, I just think one will arise in due course because it 
strikes me as a kluge.

>-- or, have Cells propagate
>the type declaration to its new method definitions.  
>
That should be easy, and sounds Deeply Correct. I am already looking at 
the slot definition name to get reader and writer names, may as well 
grab the type if any. So what's the syntax for declaring a /return/ 
type? And the synatx on the setf side as well.

>Since we've got
>eager data propogation, it would be nice to get the type errors with
>the stack still intact.  Obviously, though, this can wait for a bit
>(although I might make it one of my higher priorities once Cells is in
>CVS).
>
I hear a vote for early CVS. :)

> > Tell you what, I owe common-lisp.net a release, let me just fix the bug 
> > so a (cv 2) does get reset as advertised and the doc is accurate, then 
> > we can study this. I might want to change the syntax from :cell 
> > :ephemeral to ":cell t :ephemeral-resumes <whatever>" where by the new 
> > scheme the :cell t is unnecesary since that's the default, but anyway. 
> > Then :ephemeral-resumes is a two-fer, it gives you ephemrality as well 
> > as specifying the value to resume after a change.
>
>Hmm, :ephemeral-resumes seems like a weird name.  Maybe
>:ephemeral-default ?  Actually, I think it would be better to stick
>with the :cell :ephemeral :initform ( syntax
>
In RMS (an ISAM) one could specify that spaces or all zeros or whatever 
were the NULL_VALUE for an alternate key, meaning "if this is my value 
for this indexed field, just leave me the hell out of that index; i 
cannot be found that way". This was crucial where an indexed field was 
populated by only one or two percent weirdo records. Without NULL-VALUE, 
you get a million records with the same duplicate value, and an 
insertion could take 30 seconds as RMS read through a vast index tree 
looking for the place to insert. How is:
 
   :cell :ephemeral :c-null-value 0 :initform (cv 0)

I just feel kinda bad making them type in the initform when at this 
point DEFMODEL has enough info to auto-supply that (and I do frequently 
neglect to code in (cv nil) on ephemerals. Should we add that nicety? Do 
we need a warning if they say :c-null-value and they do not say 
:ephemeral? The parallel error went unnoticed on an RMS file with 
consequences you would not believe.

The nice thing about the suggested alternative

     :ephemeral-resumes 0 (with :cell t by default,and of course a 
better name)

is that it eliminates the redundant declaration

kenny


-- 
http://tilton-technology.com

Why Lisp? http://alu.cliki.net/RtL%20Highlight%20Film 

Your Project Here! http://alu.cliki.net/Industry%20Application






More information about the cells-devel mailing list