10

I'm trying to run this:

domain := {n, 0, 10};
Plot[n, domain]

but it doesn't work. Instead, it generates the message

Plot::pllim: Range specification domain is not of the form {x, xmin, xmax}.

and returns

Plot[n, domain].

Why?

I've also tried alternatives such as using =, or trying to define Domain[n_] = {n, 0, 10} but it all seemed to be of no avail.

rcollyer
  • 33,976
  • 7
  • 92
  • 191
user12079
  • 203
  • 1
  • 4

3 Answers3

13

Use:

domain := {n, 0, 10};
Plot[n, Evaluate[domain]]

Plot has the HoldAll attribute which prevents domain from evaluating:

Attributes[Plot]
{HoldAll, Protected}
Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
  • @Szabolcs, I think I should transfer half my reputation, since you make my terse posts actually readable. Thanks once more. –  Feb 28 '12 at 13:53
5

Indeed the cause is the evaluation order resulting from the HoldAll attribute of Plot. Here are several ways to get around this:

domain := {n, 0, 10};

Plot[n, Evaluate[domain]]

Plot[n, #] & @ domain

With[{d = domain}, Plot[n, d]]

{domain} /. {d__} :> Plot[n, d]
  • I normally favor the method using Function (&) for its brevity.
  • I think With can be the most easy to read in longer expressions.
  • The last method is specialized and is helpful in difficult operations.
Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
2

Alternatively, I only define the range but not the iterator variable, as it is then outside of its scope (n in Plot[f, {n, 0, 1}] is local to Plot):

domain = {0, 10};
Plot[n, {n, First[domain], Last[domain]}]

or

domain = {0, 10};
Plot[n, Evaluate@{n, Sequence @@ domain}]
István Zachar
  • 47,032
  • 20
  • 143
  • 291