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.

user12079

Posted 2012-02-28T13:22:07.743

Reputation: 203

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

Answers

13

Use:

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

Plot has the HoldAll attribute which prevents domain from evaluating:

Attributes[Plot]
{HoldAll, Protected}

user21

Posted 2012-02-28T13:22:07.743

Reputation:

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

Mr.Wizard

Posted 2012-02-28T13:22:07.743

Reputation: 259 163

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

Posted 2012-02-28T13:22:07.743

Reputation: 44 135