[Pharo-dev] Slot class builder: Anonymous class modification

Camille Teruel camille.teruel at gmail.com
Sat Nov 23 16:08:10 EST 2013


On 23 nov. 2013, at 20:58, Hernán Morales Durand <hernan.morales at gmail.com> wrote:

> Hi Camille,
> 
> What is an anonymous class for you? because it could refer to a lightweight class or a metaclass...

A class that is not installed in the system dictionary, typically generated. 
As pointed by Igor, that's not a very good name since such a class does have a name, it's just not accessible by simply using that name in code, you need to have a reference to it.
However, as pointed by Eliot, that's the name used for two decades now.
So in the end, metaclasses are more anonymous than anonymous classes :D

> 
> Cheers,
> 
> Hernán
> 
> El 22/11/2013 12:04, Camille Teruel escribió:
>> Hi everyone,
>> 
>> With Esteban, we bumped into a problem with anonymous subclasses and the slot class builder.
>> The problem is that once an anonymous class is created is not possible to modify it.
>> Here is the problem:
>> For creating an anonymous class with the new class builder API you do something like:
>> 
>> myAnonymousClass := AnonymousClassInstaller make: [ :classBuilder |
>> 	classBuilder
>> 		superclass: Object;
>> 		name: #MyAnonymousClass;
>> 		.... ]
>> 
>> What happens is that the class builder asks the class installer if the class named #MyAnonymousClass exists or not to know if this a class to be created or to be modified.
>> Here, the strategy of the anonymous class installer is to always answer no. So ok, now you have you're anonymous class.
>> But what happens when you do something like:
>> 
>> myAnonymousClass addInstVarNamed: #newIV
>> 
>> Since the class has no clue of what class installer was used to create it, it instantiate a new one, and a PharoClassInstaller !
>> This new class installer then says to the class builder that there is no class named MyAnonymousClass so it creates it! And it install it in the system dictionary!
>> And myAnonymousClass is not modified.
>> 
>> So there is several problem here:
>> - a class doesn't know which class installer was used to create it
>> - even if the class would know that, the anonymous class installer would always say that it doesn't know it and a new class would be created
>> 
>> So one possible solution for that is to have one class installer per environment (so add one iv in SystemDictionary right now), like that a class would know what class installer was used to create it.
>> What would happen then is that you don't create anonymous classes anymore, that is to say a class not installed in any environment, but instead you create a class that exist in an environment separated from the system dictionary.
>> 
>> What do you think?
>> 
>> 
>> .
>> 
> 
> 





More information about the Pharo-dev mailing list