Fw: Re: Work with Contexts
- To: mathgroup at smc.vnet.net
- Subject: [mg35795] Fw: [mg35785] Re: Work with Contexts
- From: "Hermann Schmitt" <schmitther at netcologne.de>
- Date: Thu, 1 Aug 2002 04:35:03 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Allen and Jens-Peer, I understand you, the line Print["Context von klasse: ", Context[klasse]]; causes the definition of "klasse" to be created in the Context Global` I thank you for your help! I exerted much effort without finding the cause! I do dislike local variables because they mean more writing effort, I think they are often not necessary for tests. This test had the aim to define "klasse" in the context "Rechteck`", where the context will be a variable in the final program.. Hermann Schmitt ----- Original Message ----- From: "Jens-Peer Kuska" <kuska at informatik.uni-leipzig.de> To: mathgroup at smc.vnet.net Subject: [mg35795] [mg35785] Re: Work with Contexts > Hi, > > according to Allan's an my explanation > > Mathematica *must* parse the definition of oo`new12[] *before* > it is evaluated. Because you don't like local variables you > write > > oo`new12[] := ( > Print["Name klasse - Anfang"]; > Print["$Context: ", $Context]; > Print["$ContextPath: ", $ContextPath]; > ToExpression[oo`hfield]; > Print["Context von klasse: ", Context[klasse]]; > oo`resumeContext[]; > Print["Name klasse - Ende"]; > ); > > and parsing this create a global symbol "klasse" because > the parser see the line > > Print["Context von klasse: ", Context[klasse]]; > > If you wish to avoid this you can use > > oo`new12[] := Module[{UsingObjectsIsDaft`class}, > Print["Name klasse - Anfang"]; > Print["$Context: ", $Context]; > Print["$ContextPath: ", $ContextPath]; > UsingObjectsIsDaft`class = ToExpression[oo`hfield]; > Print["Context von klasse: ", > Context[Evaluate[UsingObjectsIsDaft`class]]]; > oo`resumeContext[]; > Print["Name klasse - Ende"]; > ]; > > > Regards > Jens > > > Hermann Schmitt wrote: > > > > Hello Allan, > > I have a new program: > > > > oo`hfield = "klasse1"; > > oo`newContext[ctxp_] := ( > > > > $ContextPath = Join[ctxp, $ContextPath]; > > BeginPackage[ctxp[[1]]]; > > If[Length[ctxp]>1, > > $ContextPath = Join[ctxp, Rest[$ContextPath]]; > > ] > > ) > > oo`resumeContext[] := ( > > EndPackage[]; > > $ContextPath = Drop[$ContextPath, 1]; > > ) > > oo`new11[x_] := ( > > Print["Anfang new11"]; > > klassnam = x; > > tsx = ToString[klassnam]; > > oo`dat = "D:\\Math_OO\\classes\\" <> tsx <> ".cl"; > > ctx = klassnam <> "`"; > > oo`newContext[{ctx}]; > > ) > > oo`new12[] := ( > > Print["Name klasse - Anfang"]; > > Print["$Context: ", $Context]; > > Print["$ContextPath: ", $ContextPath]; > > ToExpression[oo`hfield]; > > Print["Context von klasse: ", Context[klasse]]; > > oo`resumeContext[]; > > Print["Name klasse - Ende"]; > > ); > > Print["Anfang Programm:"]; > > Print["$Context: ", $Context]; > > Print["$ContextPath: ", $ContextPath]; > > oo`new11["Rechteck"]; > > Print["nach new11:"]; > > Print["$Context: ", $Context]; > > Print["$ContextPath: ", $ContextPath]; > > oo`hfield = "klasse"; > > oo`new12[]; > > Print["nach new12:"]; > > Print["$Context: ", $Context]; > > Print["$ContextPath: ", $ContextPath]; > > > > and the results: > > > > Anfang Programm: > > $Context: Global` > > $ContextPath: {Global`, System`} > > Anfang new11 > > nach new11: > > $Context: Rechteck` > > $ContextPath: {Rechteck`, System`} > > Name klasse - Anfang > > $Context: Rechteck` > > $ContextPath: {Rechteck`, System`} > > klasse > > klasse::shdw: Symbol klasse appears in multiple contexts {Rechteck`, > > Global`} > > ; definitions in context Rechteck` > > may shadow or be shadowed by other definitions.Context von klasse: > > Global` > > Name klasse - Ende > > nach new12: > > $Context: Global` > > $ContextPath: {Global`, System`} > > In[19]:= > > > > According your theory, I think, "klasse1" should be defined in Global` and > > "klasse" only in Rechteck But this is not the case. Therefore - excuse me - > > I doubt, that your theory is correct. > > > > Hermann Schmitt > > > > ----- Original Message ----- > > From: "Allan Hayes" <hay at haystack.demon.co.uk> To: mathgroup at smc.vnet.net > > Subject: [mg35795] [mg35785] Re: Work with Contexts > > > > > Hermann, > > > > > > > My question is: > > > > Why is the variable "klasse" also defined in the context Global? > > > > > > klasse is created in the context "Global`" when the assignment > > > > > > oo`new12[] := (Print["Name klasse - Begin"]; > > > Print["$Context: ", $Context]; > > > Print["$ContextPath: ", $ContextPath]; > > > ToExpression["klasse"]; > > > Print["Context of klasse: ", Context[klasse]]; > > > oo`resumeContext[]; > > > Print["Name klasse - End"];) > > > > > > is converted into internal form (with contexted symbols) prior to > > > evaluation. > > > > > > This is before > > > oo`new11["Rechteck"]; > > > is evaluated > > > > > > -- > > > Allan > > > > > > --------------------- > > > Allan Hayes > > > Mathematica Training and Consulting > > > Leicester UK > > > www.haystack.demon.co.uk > > > hay at haystack.demon.co.uk > > > Voice: +44 (0)116 271 4198 > > > Fax: +44 (0)870 164 0565 > > > > > > > > > "Hermann Schmitt" <schmitther at netcologne.de> wrote in message > > > news:ai06l0$19t$1 at smc.vnet.net... > > > > Hello, > > > > I have the following program: > > > > > > > > oo`newContext[ctxp_] := ( > > > > BeginPackage[ctxp[[1]]]; > > > > ) > > > > oo`resumeContext[] := ( > > > > EndPackage[]; > > > > $ContextPath = Drop[$ContextPath, 1]; > > > > ) > > > > oo`new11[x_] := ( > > > > Print["Begin new11"]; > > > > klassnam = x; > > > > ctx = klassnam <> "`"; > > > > oo`newContext[{ctx}]; > > > > ); > > > > oo`new12[] := ( > > > > Print["Name klasse - Begin"]; > > > > Print["$Context: ", $Context]; > > > > Print["$ContextPath: ", $ContextPath]; > > > > ToExpression["klasse"]; > > > > Print["Context of klasse: ", Context[klasse]]; > > > > oo`resumeContext[]; > > > > Print["Name klasse - End"]; > > > > ); > > > > Print["Begin Programm:"]; > > > > Print["$Context: ", $Context]; > > > > Print["$ContextPath: ", $ContextPath]; > > > > oo`new11["Rechteck"]; > > > > oo`new12[]; > > > > Print["after new12:"]; > > > > Print["$Context: ", $Context]; > > > > Print["$ContextPath: ", $ContextPath]; > > > > > > > > I get the following results: > > > > > > > > Begin Programm: > > > > $Context: Global` > > > > $ContextPath: {Global`, System`} > > > > Begin new11 > > > > Name klasse - Begin > > > > $Context: Rechteck` > > > > $ContextPath: {Rechteck`, System`} > > > > klasse > > > > klasse::shdw: Symbol klasse appears in multiple contexts {Rechteck`, > > > > Global`} > > > > ; definitions in context Rechteck` > > > > may shadow or be shadowed by other definitions.Context of klasse: > > > > Global` > > > > Name klasse - End > > > > after new12: > > > > $Context: Global` > > > > $ContextPath: {Global`, System`} > > > > In[14]:= > > > > > > > > My question is: > > > > Why is the variable "klasse" also defined in the context Global? > > > > > > > > Hermann Schmitt > > > > > > > > > > > > > > > > > > > > > >