## Problem when defining variable in Mathematica

10

1

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.

Works as-is in version 12. – Christopher Lamb – 2020-02-21T22:09:57.450

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, I think I should transfer half my reputation, since you make my terse posts actually readable. Thanks once more. – None – 2012-02-28T13:53:58.263

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.

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