[pro] Initialization of shared slots

Svante Carl v. Erichsen Svante.v.Erichsen at web.de
Wed Jan 5 23:38:56 UTC 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello!

In chapter 7.1.5, the fourth bullet of shared-initialize is:

"Any slots indicated by the second argument that are still unbound at
this point are initialized according to their :initform forms."

There is no hint that "slots" could refer only to local slots, so I
think that combined with the following from chapter 7.1.4:

"If a slot has both an :initform form and an :initarg slot option, and
the initialization argument is defaulted using :default-initargs or is
supplied to make-instance, the captured :initform form is neither used
nor evaluated."

there seems to be a strong hint that the behaviour you describe is
actually not as intended by the specification:  :initform forms should
only be evaluated during shared-initialize.

As to your style question:  I think that a class-allocated slot
expresses primarily the invariant that this value is always the same for
each instance.  I see no problem with the encapsulation idea, though.

Best wishes
Svante

Am 05.01.2011 23:08, schrieb Didier Verna:
> rm at tuxteam.de wrote:
> 
>> On Wed, Jan 05, 2011 at 06:15:34PM +0100, Didier Verna wrote:
>>>
>>> Tim Bradshaw pointed out that my message was not very clear because the
>>> test I gave does not demonstrate that an initform's result is used to
>>> initialize the slot early, only at which time a slot is initialized.
>>>
>>> This on the other hand gets closer to the point:
>>>
>>> (defclass test ()
>>>   ((slot :allocation :class :initform t :initarg :slot)))
>>>
>>> (defmethod initialize-instance :before ((test test) &key)
>>> 	   (format t "Slot value: ~A~%" (slot-value test 'slot)))
>>>
>>>
>>> Fresh SBCL:
>>> CL-USER> (make-instance 'test)
>>> Slot value: T
>>> #<TEST {B8115E1}>
>>>
>>> Fresh SBCL again:
>>> CL-USER> (make-instance 'test :slot nil)
>>> Slot value: T
>>> #<TEST {B92AC89}>
>>>
>>> So it appears that even when an initarg is provided, the slot is still
>>> initialized to the iniform value prior to anything else.
>>
>> Ecuse my ignorance, but what are you testing? During your second
>> make-instance call the (initialize-instance :before  ...) method is
>> _not_ picking up the initform but the actual slot value from the class
>> (remember: slot has class allocation and it's value gets initialized in
>> the first invocation of make-instance 'test).
> 
>   No, I said "Fresh SBCL /again/". SBCL is restarted brand new so that
> both of the calls to make-instance above are creating the /first/
> instance of that class.
> 

- -- 
Svante Carl v. Erichsen
Wentorfer Str. 96
21029 Hamburg

+49-(0)40-34923721
+49-(0)160-6941474
Svante.v.Erichsen at web.de
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk0lARAACgkQFZBb0npmKswCEQCfbl4zhtBtNX+WNqipef/4FZWX
oIkAn1S3d594emEPAkWUeMEH4zyVO6t0
=+g+G
-----END PGP SIGNATURE-----




More information about the pro mailing list