Context Woes (questions!) in application design...
- To: mathgroup at smc.vnet.net
- Subject: [mg115731] Context Woes (questions!) in application design...
- From: Jason Ledbetter <jasonbrent at gmail.com>
- Date: Wed, 19 Jan 2011 05:28:32 -0500 (EST)
(sorry for the length...) Folk, I'm looking for pointers on general design principles for Context management in mathematica applications. The workflow I'm looking to enable is: 1) user loads base package: <<myPackage` 2) The init.m for myPackage sets up some shared data in Global` context, like SQL connection pool and manages clean shutdown on exit ($Epilog, etc). 3) From the same notebook step 1 was run in, a function is run that opens a new, custom notebook: foo[]. "foo" is defined in the Private` section of myPackage` and exported in the public section with a usage statement. 4) The notebook that is opened via foo[] has a custom-ish UI using a docked cell that I'll call "system1". 5) user enters some data in the customUI and data is populated in that notebook via SQL queries/etc that analytically describes attributes of a physical system "system1". A palette based toolbar for running pre-defined functions can be opened from the docked Cell and all output goes to the "system1" notebook. That functionality basically works as I'm expecting... However, this model breaks when another "instance" of "foo[]" is run. An additional notebook is opened and variables are basically isolated, however data sharing between unique notebooks is somewhat difficult. I was thinking that the solution would be to specify a custom CellContext when the notebook was created via the foo[] function. And this is where I begin to lose comprehension of M and Contexts... In the notebook I ran "foo[]" from, $ContextPath still shows the full path I expected, e.g., DatabaseLink, myPackage, etc.However, In the notebook created by "foo[]", shows a $ContextPath of JUST the specific CellContext I set and "System`". According to the documentation, $ContextPath is a global variable. According to my two notebooks, both are referring to System`$ContextPath. So how do they each have a unique value? My thought was to somehow specify $ContextPath as well as CellContext when I create the new notebook via the "foo[]" function.. but I can't figure that part out. (ultimately my thinking is by using Cases, Contexts[], Names[], etc I can "manage" data cleanup, data sharing, isolate unique instances by looking at myPackage`instances`, etc...) Questions: A) Is there a simpler way? B) Is there a solution to programmatically specifying $ContextPath on a created notebook (InitializationCell doesn't seem to do it because as best I can tell it doesn't autorun)? C) How can what is apparently a global variable ($ContextPath) have two different values? (As best I can tell, I'm only running 1 instance of M on my machine). Thanks, -jbl