|
|
Re: Dynamic scoping
Posted:
Feb 5, 2013 3:06 AM
|
|
On 2/2/2013 11:49 PM, Rolf.Mertig@gmail.com 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:
Addition[x_,y]:=x+y;
Block[{Plus=Addition},Print[Plus[1,2]]]
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 expected:
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.
RJF
|
|