Strategies to re-engineer someone else's notebook?

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

```Mathgroup,
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
notebooks?

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]),
Infinity]]
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?