Re: Mathematica daily WTF
- To: mathgroup at smc.vnet.net
- Subject: [mg114952] Re: Mathematica daily WTF
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Fri, 24 Dec 2010 04:10:48 -0500 (EST)
On 12/23/10 at 3:54 AM, no.email at please.post (kj) wrote:
>The mimic of Attributes defined below works the same inside the
>Block as it does outside it, as long as the localized value is the
>same as the global value (this last condition makes the statement
>sound almost tautological, but the point is that the same
>near-tautology does not hold for Attributes, nor for many other
>symbols in System`):
>In[1]:= attributes = Function[s, Attributes[s],
>Evaluate[Attributes[Attributes]~Complement~{Protected}]];
>In[2]:= Block[{attributes = attributes, Context = Context},
>Print[attributes[{Context, Sin}]];
>]
>{{}, {Listable, NumericFunction, Protected}}
>In[3]:= Block[{Context = Context}, Print[attributes[{Context, Sin}]];
>]
>{{}, {Listable, NumericFunction, Protected}}
>IOW, Block-localization doesn't turn attributes into an inert
>symbol, the way it does to Attributes. Replacing attributes by
>Attributes throughout In[2] and In[3] will show that
>Block-localization as shown radically alters Attributes behavior.
I am not convinced there is anything strange about the way
Attributes and Block work together. It seems to me the reason
Block[{Context = Context}, Attributes[Context]]
yields {} is that the attributes of the local variable simply
are not inherited when using Set. That is:
In[1]:= Attributes[f] = {Listable};
g = f;
Attributes[{f, g}]
Out[3]= {{Listable},{}}
Adding more layers of abstraction won't change this behavior.
Additional layers of abstraction simply obscures the fact that
Set doesn't pass on attributes.