Protect a variable against being used as an iterator (related to the HoldAll - Evaluate problem)
- To: mathgroup at smc.vnet.net
 - Subject: [mg116107] Protect a variable against being used as an iterator (related to the HoldAll - Evaluate problem)
 - From: Guido Walter Pettinari <coccoinomane at gmail.com>
 - Date: Wed, 2 Feb 2011 06:09:05 -0500 (EST)
 
Dear Mathematica group,
I would like to ask you a simple question that, if answered, would
make my life much easier :-)
Does anybody know how to trigger a warning/error message whenever a
particular symbol is used as an iterator? By iterator, I mean the
second argument of functions like Plot, Table, Sum, i.e. the "i" in
Table [ i^2,  {i, 10} ]
I am looking for this feature since I get errors/unmeaning results
whenever I use as an iterator a variable already defined in some other
part of the code (which I may have forgot of).
E.g., this happens with NDSolve.  Take the following example:
tmin = 0;
tmax = 1;
sol[a_] := NDSolve [ {y'[t] == a y[t], y[0] == 1},  y,  {t, tmin,
tmax} ]
exp[a_, t_] := y[t] /. sol[a]
The following Plot command does not work:
Plot[exp[2, t], {t, tmin, tmax}]
while changing the iterator name works:
Plot[exp[2, x], {x, tmin, tmax}]
I know that (i) the first Plot command does not work because Plot
(like Table and Sum) has the HoldAll attribute, and (ii) using the
Evaluate function on exp[2, t] solves the problem.
However, say that I publish a package that uses a variable in the same
way I use "t" in the above example.  How does the user of the package
know that she should not use that variable to iterate?  It would be
nice if she gets a warning message whenever she tries to do so.
I guess that a workaround would be to use a Unique[] symbol, either as
an iterator or as, say, the NDSolve independent variable.... do you
think this is doable?
Thank you very much!
Regards,
Guido