A nice fix.
http://code.google.com/p/pharo/issues/detail?id=246&colspec=ID%20Type%20Status%20Summary
The discussion on squeakdev was interesting.
Stef
Begin forwarded message:
From: "Eliot Miranda" <[EMAIL PROTECTED]>
Date: October 13, 2008 9:43:15 PM CEDT
To: "The general-purpose Squeak developers list" <[EMAIL PROTECTED]
>
Subject: Re: [squeak-dev] re: About classVariables
Reply-To: The general-purpose Squeak developers list <[EMAIL PROTECTED]
>
On Mon, Oct 13, 2008 at 2:02 AM, Martin Beck <[EMAIL PROTECTED]
> wrote:
Craig Latta wrote:
>
> Hi Stef--
>
>> To my stupefaction I discovered that the classVariables of a
class are
>> not the same as the ones of its metaclass.
>>
>> TheRoot classVarNames ~= TheRoot class classVarNames
>>
>> Does any body have some ideas why this is like that? For me this
is a
>> conceptual bug.
>
> Actually, metaclasses don't really have class variables at
all.
> Class variables are defined by Class, which is a sibling of
Metaclass,
> not a superclass. There's a method in Behavior which just answers
a new
> empty Set for classVarNames; this is what you're invoking when you
> evaluate [TheRoot class classVarNames].
>
However,
TheRoot classPool = TheRoot class classPool
evaluates to true...
Regards,
Martin
One fix is to add the following method:
------------8<-----------
!Metaclass methodsFor: 'class variables' stamp: 'eem 10/13/2008
12:37'!
classVarNames
"Answer a Set of the names of the class variables defined in the
receiver's instance."
^thisClass classVarNames! !
------------8<-----------
c.f. Metaclass>>classPool.
But a better fix is to move Class>>classVarNames to ClassDescription:
------------8<-----------
'From Croquet1.0beta of 11 April 2006 [latest update: #1] on 13
October 2008 at 12:41:36 pm'!
!ClassDescription methodsFor: 'class variables' stamp: 'eem
10/13/2008 12:41'!
classVarNames
"Answer a Set of the names of the class variables defined in the
receiver."
^self classPool keys! !
Class removeSelector: #classVarNames!
------------8<-----------
Whoever said that the class variables of a metaclass should be
those of Metaclass is very wrong. Code compiled in the context of
a metaclass includes the class variables of the non-metaclass
(metaclass's instance), otherwise one couldn't access class
variables in class-side methods.
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project