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

Ron Teitelbaum Ron at USMedRec.com
Tue Feb 27 15:47:27 UTC 2007


Greg is right, so you need to either load the class into a new image that
doesn't have it, since loading a class executes the class side #initialize
method, or you need to execute the method yourself and save the image.

Ron


> From: Greg Trasuk
> Sent: Tuesday, February 27, 2007 10:30 AM
> 
> I suspect you are "thinking in Java".  Indeed, when you run a Java
> program, its class variables will be initialized when the class is
> loaded into the virtual machine, in other words the first time you
> reference the class.
> 
> But Squeak is different; it's a live image system.  When you are editing
> the class, you're actually making changes to the class in the running
> system.  When you restart Squeak, the entire memory image of the virtual
> machine is reloaded from the last saved image, including the state of
> any class variables (and instance variables, and processes, etc).
> 
> Cheers,
> 
> Greg.
> 
> On Tue, 2007-02-27 at 07:51, Mispunt wrote:
> > I am sorry, I did mean execute. I hoped that it would execute
> > initialize when the class (or variableNames) where called by the
> > program..
> > After running/execute the initialize method it is working :)
> >
> > Thanks for you'r help,
> >
> > Mispunt
> >
> > On 2/27/07, Bert Freudenberg <bert at freudenbergs.de> wrote:
> > > What do you mean with "isn't running"? As I wrote, you have to
> > > execute it manually whenever you change the initialize method.
> > >
> > > - Bert -
> > >
> > > On Feb 27, 2007, at 13:33 , Mispunt wrote:
> > >
> > > > After some better testing, It doesn't work :S It seems that the
> > > > initialize of the constants class isn't running... (the normal
> > > > classVariableNames are working...) I have to use the poolDictionary
> > > > because there are some codes that return in a lot of classes..
> > > >
> > > > Mispunt
> > > >
> > > > On 2/27/07, Mispunt <mispunt at users.sourceforge.net> 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 -
> > > >> >
> > >
> > > _______________________________________________
> > > Beginners mailing list
> > > Beginners at lists.squeakfoundation.org
> > > http://lists.squeakfoundation.org/mailman/listinfo/beginners
> > >
> > _______________________________________________
> > Beginners mailing list
> > Beginners at lists.squeakfoundation.org
> > http://lists.squeakfoundation.org/mailman/listinfo/beginners
> 
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners




More information about the Beginners mailing list