Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2010

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

Search the Archive

Re: notebooks default context

  • To: mathgroup at smc.vnet.net
  • Subject: [mg112361] Re: notebooks default context
  • From: apjs64 <apjs64 at gmail.com>
  • Date: Sat, 11 Sep 2010 05:42:41 -0400 (EDT)
  • References: <i64kfg$39a$1@smc.vnet.net> <i652tt$9sb$1@smc.vnet.net>

On Sep 10, 6:48 pm, David Reiss <dbre... at gmail.com> wrote:
> On Sep 9, 4:21 am, magma <mader... at gmail.com> wrote:
>
>
>
>
>
> > On Sep 7, 12:07 pm, Albert Retey <a... at gmx-topmail.de> wrote:
>
> > > Hi,
>
> > > > Firstly a problem, my packages (.m)  keep having their context reset
> > > > to global every time I open them to edit rather than "unique to each
> > > > cell"  to which I have previously set them to.
>
> > > > THIS IS THE QUESTION (rest waffle)
> > > > I would like to set a notebooks default context to "Unique to each
> > > > cell" in a notebook initialisation cell. Usually I use "Unique to this
> > > > notebook" from the menu (which is fine and persists), however on
> > > > occasion I would like to tighten things up.
>
> > > > ------------
> > > > WAFFLE
> > > > ------------
> > > > I think I don't clearly understand the use of the Package` context
> > > > instructions. My basic package setup is as follows (which works):
>
> > > > BeginPackage[ "Package`"]
> > > >   Begin[ "Public`"]
> > > >      preProcess`outNB[nb_] = "something";
> > > >   End[];
> > > >   Begin[ "Private`"]
> > > >   End[]
> > > > End[]
>
> > > > so this is could be one source  of the problem.
>
> > > > This is part of a general question on good programming technique in
> > > > mathematica. My instinct is that for non-trivial notebooks and
> > > > packages "unique to cell" is the best method and the results should
> > > > then be put into a context for the notebook to make them available to
> > > > other cells.
>
> > > I think as long as your work is all in one notebook, you usually don't
> > > really need to take too much care about namespaces (Contexts) at all.
> > > The use of Contexts only makes sense if your code gets complex enough so
> > > that the use of different namespaces for different encapsulated parts of
> > > your code is necessary to keep it maintainable. In these cases I think
> > > the "best practice" is to create a single file for each of these parts,
> > > and create a package file (*.m) which contains the BeginPackage/Begin
> > > stuff that controls in which Context the various symbols will be created.
>
> > > You would then use Needs or Get in the notebook(s) that make use of the
> > > packages. The use of the settings for default contexts is actually a
> > > relatively new feature that seems to be used mainly in the documentation
> > > notebooks. It could probably be used also when developing and debugging
> > > packages or when creating graphical user interfaces, but I don't think
> > > that there are many people actually using it, and it is not really
> > > necessary and certainly an advanced feature. I would suggest that you
> > > don't care about it until you really are sure you know how to use
> > > contexts and packages in a more standard way.
>
> > > Concerning your package structure: you are using a Begin["Public`"]
> > > which is very unusual, do you have a good reason to do so? The usual
> > > setup is:
>
> > > BeginPackage["MyPackage`"]
> > >    publicfunction::usage = "publicfunction...";
> > >    Begin["`Private`"]
> > >       publicfunction[x_,y_]:=privatefunction[x]+y;
> > >       privatefunction[x_]:=x^2;
> > >    End[]
> > > End[]
>
> > > Every symbol that is mentioned between the BeginPackage and Begin will
> > > be public, everything else will be private. When you load such a
> > > package, you will usually not need to explicitly use the package context
> > > anywhere in your code, since the package context will be on
> > > $ContextPath, so all public symbols of the package can be addressed
> > > without explicit context prefixes.
>
> > > Also note that only with a leading ` the "`Private`" context will be
> > > "MyPackage`Private`", otherwise the private symbols of all your packages
> > > will live in the same context, "Private`", which is usually exactly what
> > > you try to avoid by using contexts.
>
> > > > Regarding a previous post on fonts I now use:
>
> > > >    SetOptions[$FrontEnd, FontFamily->"Arial"];
> > > >    SetOptions[$FrontEnd, FontSize->10];
>
> > > > as soon as you ask the question, the solution suddenly becomes clear!
>
> > > If this works for you, I don't know an important reason to not do so,
> > > but I think the usual way to control the appearance of fonts is to
> > > create or change stylesheets. You usually would create your own style
> > > sheet, probably inherting from one that is close to what you want, and
> > > then, if you want it to be used as a default, set the
> > > DefaultStyleDefinitions option in the option inspector to use that
> > > stylesheet.
>
> > > hth,
>
> > > albert
>
> > apjs64,
> > Albert preceded me in replying to you, but here is my 2 cents advise
> > anyway.
>
> > FORGET about notebook contexts or cell contexts!
> > These are things used by WRI developers or by people writing complex
> > documentation which needs to be kept somehow separated from a normal
> > Mathematica session.
> > Common mortals, including common developers, FORGET IT.
>
> > What is left? Normal packages and contexts. Do you understand them
> > completely? I think not yet, judging by the example Package you wrote.
> > Albert gave you a template package. Stick to it. Even if you do not
> > fully understand why it is written this way. Stick to it.
> > But even better, try to understand why it works.
> > I suggest you read Maeder's "Programming in Mathematica" (3rd ed., but
> > the 2nd is good enough. I use the second). It covers Mathematica 3.x or
> > earlier versions, but that is NOT important.
> > It explains the Package/Context thing "frame by frame", so to speak.
> > So you understand exactly what happens when Mathematica reads a Package.
> > Other more recent programming Mathematica books may explain the process too,
> > but Maeder's book is the definitive resource for me.
> > So to go back to your example package, you seem to attach a semantic
> > (that is: a meaning) to the context name. You thing a context is
> > public if it is called Public and private if it is called Private.
> > That is NOT so! You might call them Bingo and Bongo and they still
> > would be private. Both of them.
>
> > So again, stick to Albert's example package format and try to get
> > Maeder's book.
>
> I'd like to point out that I completely agree with this post.... It is
> the wisest of advice...

Well since we're running some sort of fan club here I will point out I
have this afternoon
got Roman Maeder's book (2nd Ed) from the library and it seems...
superb. It has a quality
 I admire and that seems to be lacking from many mathematica books
(not that I've looked at any), brevity.

Thanks and regards,

Jeremy


  • Prev by Date: Re: FindRoots?
  • Next by Date: Re: Display Workspace
  • Previous by thread: Re: notebooks default context
  • Next by thread: Re: How to delay action of ...[[i]] (Part[...,i]) until