MathGroup Archive 2010

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

Search the Archive

Re: NotebookGet/Read/EvaluateSelection Issues

  • To: mathgroup at
  • Subject: [mg106891] Re: NotebookGet/Read/EvaluateSelection Issues
  • From: David Bailey <dave at>
  • Date: Tue, 26 Jan 2010 06:35:13 -0500 (EST)
  • References: <hj98as$g52$>

Paul wrote:
> My fellow Mathematica'ians...
> I am having difficult time figuring out whether it's my programming or
> the bugs:... I have first notebook called xy.nb that simply has
> y=x+3
> and then I have another notebook that has the following:
> test=NotebookOpen[xy.nb];
> NotebookRead[test];
> x=7;
> SelectionMove[test,All,Notebook];   (*Seems I have to force selection,
> even though there's only one cell in the entire notebook xy.nb?*)
> SelectionEvaluate[test];
> Print["y equals to ",y]
> Naturally, I'd expect the output to read, "y equals to 10" but the
> output is "y equals to y"...the variable "y" remains unevaluated or
> unassigned.  If I re-evaluate the y (either redoing the whole thing
> with kernel still running, or manually calling variable "y" by typing
> in frontend, "y" and hitting shift-enter.
> This is simple example of my project, I wanted to develop a modular-
> style programming instead of really long single notebook to do my
> Dissertation work..and be able to call certain functions in separate
> notebooks (optional mathematical calculations, for instance)..and keep
> all global variables intact to be used in all calculations (AND be
> immediately usable once evaluated!).  Right now, I can't call xy.nb to
> do calculations, and take the value of "y" to do another type of
> calcuation since the value of "y" remains unassigned.
> Thank you!
To answer your original question, the code doesn't do what you think 
because SelectionEvaluate stacks an evaluation to be done after the 
current evaluation completes!

I have seen people use fairly exotic functions such as SelectionEvaluate 
  for the same reason you are doing, and I wish the documentation would 
somehow warn people from doing this - these functions are useful for 
notebook manipulation.

Either consider using packages - as suggested, or simply set your code 
up  as a set of functions spread across multiple notebooks, and read and 
execute each notebook in turn. The final notebook might end with a call 
to a function to kick off the actual calculation.

Remember that a .m file doesn't need to hold a package - just any 
Mathematica code, and it can sit anywhere in your file space if you use 
Get with the appropriate pathname to evaluate it. Get can also read 
notebook files according to the documentation - I have not tried it.

You really don't want to use top-level definitions for variables like 
'y' (i.e. things that look like algebraic variables) because they 
invariably stick around and bite back further down when you have 
forgotten them. Rather than writing y=3, I would use a replacement rule 
on an expression:

expr /. y->3

That way, the replacement of y by 3 is localised.

David Bailey

  • Prev by Date: Re: More memory-efficient inner product for large last
  • Next by Date: Re: Creating new ColorFunction / ColorDataFunction
  • Previous by thread: Re: Re: NotebookGet/Read/EvaluateSelection Issues
  • Next by thread: Re: NotebookGet/Read/EvaluateSelection Issues