MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

RE: Shared variables between notebooks?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg46783] RE: [mg46780] Shared variables between notebooks?
  • From: "David Park" <djmp at earthlink.net>
  • Date: Mon, 8 Mar 2004 04:10:18 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

Neal,

Since the kernel runs independently of the front end, it doesn't distinguish
between different notebooks that are open at the same time.

If you want to localize variables you can use a Module, With or Block
statement. But you can't very well do that for a whole notebook, if you also
want notebook structure such as Sections and multiple cells.

To make common functions available to many notebooks, write a package.
Writing packages is pretty simple but unfortunately there doesn't seem to be
a single place that lays out the simple procedure for doing so. The best
book on the topic is "Programming in Mathematica: Third Edition" by Roman
Maeder but he doesn't have the simple procedure.

Here is a sample toy package. Copy it and paste it into a fresh notebook.

Notebook[{

Cell[CellGroupData[{
Cell["A Toy Package", "Title"],

Cell[BoxData[
    \(BeginPackage["\<Algebra`ToyPackage`\>"]\)], "Input"],

Cell[BoxData[
    \(\(Algebra`ToyPackage::usage = "\<This is a usage mesage for the \
entire package.\>";\)\)], "Input"],

Cell[BoxData[
    \(\(SquareTheQuantity::usage = "\<SquareTheQuantity[x] will take \
the square of x.\>";\)\)], "Input"],

Cell[BoxData[
    \(Begin["\<`Private`\>"]\)], "Input"],

Cell[BoxData[
    \(SquareTheQuantity[x_] := x\^2\)], "Input"],

Cell[BoxData[
    \(End[]\)], "Input"],

Cell[BoxData[
    \(\(Protect[Evaluate[$Context <> "\<*\>"]];\)\)], "Input"],

Cell[BoxData[
    \(EndPackage[]\)], "Input"]
}, Open  ]]
},
FrontEndVersion->"5.0 for Microsoft Windows",
ScreenRectangle->{{0, 1280}, {0, 941}},
WindowSize->{494, 740},
WindowMargins->{{81, Automatic}, {Automatic, 61}}
]

1) Make all the cells initialization cells. (I uninitialized them so you
could go through the following process.)

2) Give the notebook the name ToyPackage.nb and save it in the
AddOns/ExtraPackages/Algebra folder using SaveAs. (You may have to first
create the Algebra Folder there. You could also save it in
Applications/Algebra.) Notice that the BeginPackage statement gives the name
of the package as "Algebra`ToyPackage`" reflecting the folder location.

3) The first time you save the notebook Mathematica will ask if you want to
create an AutoSave Package. Answer yes. Then when the save is done,
Mathematica will also create a ToyPackage.m package file. Everytime you edit
the .nb file and save, Mathematica will automatically update the .m package
file.

To load the package into a notebook use the following statement at the
beginning of the notebook...

Needs["Algebra`ToyPackage`"]

That is basically it, but I'm sure other people will have a number of
glosses to add.

David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/


From: Neal Richter [mailto:richter at cs.montana.edu]
To: mathgroup at smc.vnet.net

Hello,
    I'm using Mathematica 4.1 for Linux and am noticing some odd
behavior.

1) It appears that when I have multiple notebooks open, the variables
and functions are 'shared'..  ie they have global scope.  Can I change
this?

2) Is there a "#include" type command in mathematica?   I'd like to be
able to have a notebook with common functions I use, and include it in
other notebooks where use the functions.

As you can tell I'm a C/C++ programmer.  Has anyone on the list used
the Mathematica->C++ code generator?  Opinions?

Thanks!

Neal Richter



  • Prev by Date: Re: Mathematica to Word
  • Next by Date: ND Solver problem
  • Previous by thread: Re: Shared variables between notebooks?
  • Next by thread: Re: Shared variables between notebooks?