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