Services & Resources / Wolfram Forums / MathGroup Archive

MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Dynamic scoping

  • To: mathgroup at
  • Subject: [mg129700] Re: Dynamic scoping
  • From: Richard Fateman <fateman at>
  • Date: Tue, 5 Feb 2013 03:06:10 -0500 (EST)
  • Delivered-to:
  • Delivered-to:
  • Delivered-to:
  • Delivered-to:
  • References: <keiatl$qq3$> <kel4qe$38d$>

On 2/2/2013 11:49 PM, Rolf.Mertig at wrote:

> Block[{Plus = "Plus"}, t = ToString[Plus[1, 2]];
>   Print[t];]
> will do what you want

No, I think what he wanted was to display a bug in Mathematica.
You just wrote another program.

To illuminate the bug I tried this:



which returns an infinite stream of errors that look like
Join::heads: Heads PacletManager`Package`LDCfindForDocResource and 
PacletManager`Package`MCfindForDocResource at positions 1 and 2 are 
expected to be the same.

I think the explanation needs some explanation, but setting that aside
I tried these:

Block[{P = Addition}, Print[P[1, 2]]]

prints 3

Block[{P = foo}, Print[P[1, 2]]]

prints foo[1,2]

An explanation may be simply that

Block[{Plus}} ....]

binds the name Plus not to some "undefined object" but to the value of 
Plus in the dynamically enclosing scope.  Indeed, this works as

Block[{Plus = hello}, Block[{Plus = Plus}, Plus[1, 2]]]

returns hello[1,2]

this explanation is not accurate because

Block[{Plus = hello}, Block[{Plus}, Plus[1, 2]]]

returns 3.

So Block[{Plus}, ...
binds the name Plus, or any other Global symbol? to the Global value.

I think that this is a bug.


  • Prev by Date: Re: Mathematica and Lisp
  • Next by Date: Re: Mathematica and Lisp
  • Previous by thread: Re: Dynamic scoping
  • Next by thread: Re: Dynamic scoping