# Problem when defining variable in Mathematica

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.

-

Use:

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


Plot has the HoldAll attribute which prevents domain from evaluating:

Attributes[Plot]
{HoldAll, Protected}

-
@Szabolcs, I think I should transfer half my reputation, since you make my terse posts actually readable. Thanks once more. –  user21 Feb 28 '12 at 13:53

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.
-

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}]

-