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 <[EMAIL PROTECTED]> 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 -




_______________________________________________
Beginners mailing list
Beginners@lists.squeakfoundation.org
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to