On 26 août 2013, at 10:56, Esteban Lorenzano wrote:

> 
> On Aug 25, 2013, at 9:40 AM, Camille Teruel <[email protected]> wrote:
> 
>> 
>> On 24 août 2013, at 19:20, Camillo Bruni wrote:
>> 
>>> We have now:
>>> 
>>> String >> #asClass
>>> String >> #asClassIfAbsent:
>>> String >> #asClassIfPresent:
>> 
>> I don't understand why we need this new way.
>> Is it just to avoid calling 'Smalltalk globals at: #MyClass'?
> 
> exactly
> 
>> Because these names are confusing, and the 'as' prefix suggests a conversion 
>> while it's an access (with indirection but still a mere access).
>> And #asClass has no sender.
>> If you think 'Smalltalk globals at: #MyClass' is really too long to type, 
>> lets just create a new global ThisEnvironment := Smalltalk globals.
> 
> this was already discussed. With #asClass and relatives what you have is a 
> better abstraction jut because you are decoupled of "Smalltalk globals", it 
> is not a big win now, but it open doors to better designs with environments, 
> etc. 
> At least, that was my understanding when the issue arise at the beginning.

It's not a better abstraction, it's a worse one. 
Sending #asClass to a symbol will ever execute the same method that anyway as 
to rely on a global: Smalltalk.
And this global is solved in only one environment: the one of the class Symbol 
where #asClass and co. are implemented.
So if you want separated environments you know what kind of thing you'll end up 
writing?

'#Foo asClassInEnvitonment: self class environment'

or implementing:

Symbol>>#asClass
        ^ self asClassInEnvironment: thisContext sender receiver class 
environment

However, as soon as the compiler use the environment of the compiled method's 
class to solves the globals it contains, Smalltalk can refer to anything.
So the only problem with: 'Smalltalk globals at:'  is that you send a message 
#globals to the global Smalltalk to fetch the environment while we could just 
have a global ThisEnvironment pointing to itself. 

Writting 'ThisEnvironment at: #Foo' is much more natural.

If we want separated environments, each environment just have to define a 
binding ThisEnvironment pointing to itself and everything works well.
What I don't like with #asClass and co. is the style: you talk to a symbol 
instead of an environment. 
It's like saying: '#key valueIn: aDict' instead of: 'aDict at: #key', 'letter 
beSentBy: postman to: receiver' instead of: 'postman send: letter to: 
receiver', etc...

In Smalltalk we already have self to refer to the current receiver and 
thisContext to refer to the current stack frame. If we want different 
environments, is it that weird to have a ThisEnvironment to refer to the 
current environment?

> 
> Esteban 
> 
>> 
>> 
>>> 
>>> On 2013-08-24, at 17:55, Fernando Olivero <[email protected]> wrote:
>>>> I prefer to evaluate
>>>> 
>>>> Smalltalk globals classNamed: #MyClass
>>>> 
>>>> Fernando
>>>> 
>>>> On Sat, Aug 24, 2013 at 11:57 AM, Stéphane Ducasse
>>>> <[email protected]> wrote:
>>>>> 
>>>>> Is it
>>>>> 
>>>>> asClass?
>>>>> 
>>>>> Stef
>>>>> 
>>>> 
>>> 
>>> 
>> 
>> 
> 
> 


Reply via email to