OK, but "Deeply Correct" I think not. A function is just another type of value. Its purpose in any given situation is defined by the /role/ it plays in that situation. :initform is a role in the object creation process. We shouldn't confuse the individual with some role played by the individual.
Just to confuse things, at one point Cells actually /did/ occupy the slot. The slot accessor handled the job of extracting a computed value and returned that. This would would also make debugging easier, but would be Deeply Wrong if we used this approach in something like AllegroStore which did Wonderful Things automatically off of slot values.
Also, re tfb's note on model-class effectively being a metaclass, at one point I /did/ use a metaclass to implement Cells and pulled it only because of portability, as you noted.
From the hyperspec: "The :initform slot option is used to provide a default initial value form to be used in the initialization of the slot. This form is evaluated every time it is used to initialize the slot." -- see, it says "every time it is used to initialize the slot" not "every time the slot is accessed."
Ah, but this describes exactly what is going on. You are confusing the stream of values coming from a formula with non-cell values normally used to initialize a slot. The one-time intialization is still present, it is just that the thing being bound to the slot is a formula or c-input (which really does no more than support an optimization).
by the way, you never explained to me how to resolve conflicts in the class precedence list where one class specifies an initform and another specifies an :initcell.
Also, what do we do about:
(make-instance 'republican :indictments (c-formula () (years-in-office self)))
That would override an initform or :default-initarg. How are cells supplied at make-instance time in your scheme?
I'd call the role :formula or even better :derived-by, not :initformula, but what's in a name? (provided that name doesn't already associate with a meaning, as does :initform).
i think the problem of the initform not actually becoming the slot value is a problem only for those who have never seen Cells before and have not had the briefest introduction. So I say leave it as it is an explain it. :)
Sure, it can be learned. Like GTK itself, I have just enough knowledge of Cells to be dangerous. My concern is getting cells-gtk users up to speed as quickly as possible. Definitions of the concepts used, and predictable semantics of the language are the what makes our work effective (and why we like lisp -- compare with Perl or Python, where the semantics change often, and are ill-defined).
But of course there are only so many hours in the day, and so much to do. So nothing is ever going to be perfect.
Could someone somewhere explain to me what is so hard to understand about:
(make-instance 'rect :area (c? (* (length self) (width self))))
Seriously. I realize it is astonishing that it works, but what else? Let's add:
(def-c-output area ((self room) new-value old-value) (when (> new-value (area (carpet self))) <trigger electronic ordering of new carpet>)))
There are a lot of examples in the test suite with some pretty simple relationships. Am I the only one who prefers examples to turgid, abstract documentation trying to sound like a PhD thesis by using big words and never saying what they really mean?
I can see questions about obscure syntax or edge cases, but not something basic like the use of :initform to supply the cell that will be mediating a slot.
kenny