[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