Thomas F. Burdick wrote:
Kenny Tilton writes:
Thomas F. Burdick wrote:
(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.
(What about "Steel Bank" says "fast and loose"? ;) Taking the CL type system seriously has a few benefits, one of which is can be being able to emit blazingly fast object code, but a big one is debugability.
gotcha.
Actually, there is a problem here. Currently Cell structures land in the slot during make-instance ...
Well, right now, any value can actually go in a slot with a declared type: type checking only happens if you go through the accessor method.
Oh, right, you said that. I thought I heard a concern that nil could not be a NULL-VALUE for a slot with an explicit numeric type specified. Oh, well, still a good idea to capture type info for the accessors Cells writes.
Cells-for-structures wouldn't work so hot, though.
Well, we'll put this in the hopper, but I propose we give higher priority to me documenting the system and getting Cello going.
Definately. I'm partly just bouncing ideas off of you, and if they seem workable, I'll make the changes myself, if I need them.
The marines have landed!
And I think I do want to make the resumed base value (what /do/ we call that?)
an at-rest value?
Not bad. I had toyed with quiesce-to.... restore-to? stable-value? fallback-value?
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.
Okay, so the initial value would be just another value it takes on ephemerally, before going back to its resting state?
Yep. the only problem is that I would have to arrange for ephemrals initialized this way to hang on to non-resting values until all other cells (in all instances being awakened in one batch) had been kicked off, because at make-instance time (well, at TO-BE time) the sytems has not stabilized with all dependencies in place, so an ephemeral does not know who to notify.
This is getting ugly. I think I'll go with resting-value because as a rule I like explicit, then wait for initialization to non-resting to come up a again so I can think more clearly about the problem.
STYLE-WARNING: redefining SHARED-INITIALIZE :AFTER (FOO T) in DEFMETHOD
Hey, SBCL is creating an after method on shared-initialize?
Oops, that was TFB that did that, not SBCL.
whew! but then we have a problem? Oh, I see, just that dumb check that someone does not use defmodel then specify superclasses, none of which inherit from model-object. I wonder if that is necessary? They'll find out soon enough (tho it could take a while to figure out. )
5368709110
- (typep * 'fixnum)
NIL
Gee, what /is/ the type?
Too much? Actually, the answer is kind of amusing. CMUCL would tell you BIGNUM. SBCL, however, is a tiny bit more precise:
- (type-of 5368709110)
(INTEGER 536870912)
Did I mention they take the type system seriously?
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?
I'd assume just the opposite, that they consider it a bug (it seems like a gap in declarations-as-assertions), but I don't see it in the BUGS file, so maybe I'm wrong. I'll ask.
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.
Ooh, yeah, that might do bad things if you have one model that inherits from another (the next-method would be the superclass' :around method).
-- 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.
This seems like a good thing for Cells to do, because that way type declarations can more fully do their thing, whatever that means on the implementation you're using. For syntax:
- (macroexpand-1 '(defmodel foo () ((x :initform (cv 0) :accessor get-x :type fixnum) (10x :cell t :accessor get-10x :type fixnum))))
...
(PROGN (DEFMETHOD GET-X ((SELF FOO)) (CELLS::MD-SLOT-VALUE SELF 'X)) (DEFMETHOD (SETF GET-X) (NEW-VALUE (SELF FOO)) (SETF (CELLS::MD-SLOT-VALUE SELF 'X) (COERCE NEW-VALUE 'FIXNUM))) NIL)
(Holy crap, where'd that COERCE come from? That's not a good idea at all, you can lose object identity that way.)
With type declarations, that would be:
(progn (defmethod get-x ((self foo)) (declare (values fixnum)) ; <==== (cells::md-slot-value self 'x)) (defmethod (setf get-x) (new-value (self foo)) (declare (type fixnum new-value)) (setf (cells::md-slot-value self 'x) new-value)) nil)
Problem is, the type-checks don't go deeply enough into cells this way. If we propagage the type declarations for 10X in the same way, we get:
(progn (defmethod get-10x ((self foo)) (declare (values fixnum)) (cells::md-slot-value self '|10X|)) (defmethod (setf get-10x) (new-value (self foo)) (declare (type fixnum new-value)) (setf (cells::md-slot-value self '|10X|) new-value)) nil)
But when X is changed, and 10X is recalculated, this method doesn't get invoked.
If DEFMODEL stuffs type info by slot and class into some global hash or property list, at make-instance time we can pull the type info into a dedicated slot in the cell structure. would that help in anyway? Looks like THE cannot use a dynamic type.
Hey, I put in the serialize option and now ASDF compiles but does not load (until the end I guess), so later compiles don't see earlier stuff. (Some serial!) . I tried coding up:
:perform (compile-op :after (op c) (load c))
but i was just guessing wildly. What's the incantation to get ADF to load as it goes?
kt