MathGroup Archive 2011

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

Search the Archive

Strategies to re-engineer someone else's notebook?

  • To: mathgroup at
  • Subject: [mg116693] Strategies to re-engineer someone else's notebook?
  • From: "W. Craig Carter" <ccarter at>
  • Date: Thu, 24 Feb 2011 06:22:19 -0500 (EST)

This is perhaps an odd but practical query, and I am guessing that some 
of you have tackled similar.  Sorry for the lengthy question below.

What is a plausible strategy to "improve" a working notebook, where the 
notebook is written in the way many beginners-to-Mathematica write 

The user that I am helping runs her notebook by changing one variable, 
evaluating the notebook, killing the kernel, changing another variable, 
evaluating the notebook....

For a concrete and artificial (hopefully amusing) example that is 
representative of about 1000 lines of code that probably started its 
life as a giant spreadsheet: the target notebook to be fixed might look 
like this

hamburgerMass = proteins + veggies + starch;
hamburgerCalories = proteins proteinCalorieDensity + veggies veggieCalorieDensity + starch starchCalorieDensity;

meat = 12;
lettuce = 8;
cheese = 13;
pickles = 1;
bun = 0.5;

proteins = If[CheeseBurger,cheese + meat,meat];
veggies = lettuce + pickles;
starch = bun;

hamburgerCosts = meat meatCosts + veggies veggieCosts + starch starchCosts

(*etc etc. Output from expressions at line 1000 become very long*)
Sometimes the user wishes to know only the number of calories, sometimes a pie chart of calorie contributions, and sometimes things like:
ParametricPlot[{hamburgerMass/.meat->x,hamburgerCalories/.meat->x},{x,0,1}] (*with all other variables assigned*).

My current strategy is to leave out any assignments, evaluate the 
notebook from a fresh kernel, and then find the dependencies of 
"derived" expressions using  a function like this:
vars[expr_] :=  Union[Cases[expr, a_ /; (! NumberQ[a] && AtomQ[a]), 
which gives all the symbols on which expr depends,
and then use these independent variables to construct functions by 
cutting and pasting.  Tedious, but a path towards doing something useful 
with Manipulate.

Another approach may be to make everything a delayed assignment; another 
would be to make everything Dynamic.

Any ideas how I might do this with less tedium and error?  Also, if the 
naive-notebook generator wishes to change a single line, I'd like to be 
able to re-engineer her notebook without duplicate labor.
Thanks, Craig

  • Prev by Date: Re: weibull plot on weibull scaled paper
  • Next by Date: Re: Rational[a,b] vs Rational[1,2]
  • Previous by thread: Re: Bug in definite integral over Gamma function?
  • Next by thread: Re: Strategies to re-engineer someone else's notebook?