Re: Variables in Iterator limits?
- To: mathgroup at smc.vnet.net
- Subject: [mg109679] Re: Variables in Iterator limits?
- From: David Bailey <dave at removedbailey.co.uk>
- Date: Tue, 11 May 2010 06:29:28 -0400 (EDT)
- References: <hs3gic$rt2$1@smc.vnet.net>
AES wrote:
> If I execute the following lines, I get the graphic that I want:
>
> x; Remove["Global`*"];
>
> lines := Graphics[ Table[ Line[{{k 10/kmax,-1},
> {k 10/kmax,1}}], {k,1,kmax}]]
>
> km = 30; Show[lines]
>
> If I execute the following lines, I get exactly the same graphic, all OK,
>
> x; Remove["Global`*"];
>
> lines := Graphics[ Table[ Line[{{k 10/kmax,-1},
> {k 10/kmax,1}}], {k,1,kmax}]]
>
> testValues = {kmax->30}; Show[lines] /. testValues
>
> -- except that I also get a beep, and an error msg in the Messages
> window:
>
> "Iterator {k,1,kmax} does not have appropriate bounds"
>
> (but no little red square in the graphics output cell).
>
> Same thing happens in the /. case if I do the two tests in reverse order.
>
> Seems like another annoying little Mathematica "gotcha" to me . . . ?
>
Clearly the error message arises from the attempt to execute the expression:
Table[ Line[{{k 10/kmax,-1},{k 10/kmax,1}}], {k,1,kmax}]
The left hand side of ReplaceAll is evaluated before the ReplaceAll is
executed - which surely makes sense!
Therefore, are you suggesting that expressions should never generate
errors if they cant be evaluated - just left unevaluated on the off
chance that a subsequent replacement will leave something that could be
evaluated!
Imagine how frustrating it would be to use a system like that!
Obviously Mathematica is not going to change in this regard, but what on
earth would you prefer it to do?
I generally avoid using SetDelayed to set the value of individual
variables (as opposed to functions) precisely because the order of
evaluation can surprise and anyway mathematical intuition leads one to
expect a variable to be no more than a repository for a value.
David Bailey
http://www.dbaileyconsultancy.co.uk