[Newbies] Re: Alternative for static const...

Bert Freudenberg bert at freudenbergs.de
Tue Feb 27 10:44:44 UTC 2007


You could simply use a browser as workspace. Like, the class comment  
area.

Or to access the variables directly from anywhere:

	(BlaConstants classPool at: #Const1)

Or you can add them to the workspace itself. A workspace provides  
variable bindings, but only for temporary (lowercase) variables (*).  
To add your class variable bindings, get the halo on a workspace,  
select "inspect model" from the grey debug handle menu. You get an  
inspector for the workspace. In the lower text pane, execute this:

bindings := Dictionary new.
BlaConstants classPool keysAndValuesDo: [:k :v | bindings at: 'c',k  
put: v]

Then you can use "cConst1" in the workspace :)

- Bert -

(*) this could be changed in Parser>>correctVariable:interval: to  
allow upper-case variables, too. The workspace is the "requestor".

On Feb 27, 2007, at 11:04 , Mispunt wrote:

> Thanks Bert, it works. When I am using the poolDictionary it isn't
> possible to use the constants in the Workspace right? or do I have to
> write methods for them when I want to use them? (well I don't want to,
> because it is just for testing purpose).
>
> Mispunt.
>
> On 2/27/07, Bert Freudenberg <bert at freudenbergs.de> wrote:
>> On Feb 27, 2007, at 10:08 , Mispunt wrote:
>>
>> > Hi all,
>> >
>> > For programming my Lego Mindstorms NXT I have to use codes like  
>> 16r1F.
>> > But I actually want to be able to use "readable" codes. In a  
>> language
>> > like Java I will do that with a static const, but as far as I  
>> know I
>> > have to do it with symbols in Smalltalk.
>>
>> No, there is a better way.
>>
>> If you are inside one class (or its subclasses), you would use "class
>> variables", one per constant. You add them in the class template:
>>
>> Object subclass: #Bla
>>         instanceVariableNames: ''
>>         classVariableNames: 'Const1 Const2'
>>         poolDictionaries: ''
>>         category: 'Bert-Bla'
>>
>> and the initialization code is in a class-side #initialize method:
>>
>> initialize
>>         "self initialize"
>>         Const1 := 16r1F.
>>         Const2 := 12345.
>>
>> You need to execute the "self initialize" in the browser to do the
>> initialization. It will be executed automatically when loaded into
>> another image.
>>
>> Class variables are capitalized because they are sort-of "global",
>> they can be used in the defining class, its metaclass, and all their
>> subclasses. If you need to give access to these variables across the
>> class hierarchies, then you would do the same, but as a subclass of
>> SharedPool:
>>
>> SharedPool subclass: #BlaConstants
>>         instanceVariableNames: ''
>>         classVariableNames: 'Const1 Const2'
>>         poolDictionaries: ''
>>         category: 'Bert-Bla'.
>>
>> To use this "pool" of variables in another class, list it as a "pool
>> dictionary":
>>
>> Object subclass: #Bla
>>         instanceVariableNames: ''
>>         classVariableNames: ''
>>         poolDictionaries: 'BlaConstants'
>>         category: 'Bert-Bla'
>>
>> This makes all class variables of BlaConstants available to Bla as if
>> they were class variables.
>>
>> There are quite a few other ways to allow "global" variables in
>> Smalltalk, but this one is the "clean" way to do it which works
>> nicely with tools like Monticello.
>>
>> - Bert -






More information about the Beginners mailing list