Re: Odd edge-case behavior of Block
- To: mathgroup at smc.vnet.net
- Subject: [mg129978] Re: Odd edge-case behavior of Block
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Thu, 28 Feb 2013 21:29:42 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <kgmn91$8hg$1@smc.vnet.net>
On 2013-02-28 04:43:13 +0000, Roger Wilson said:
> Block is used to localize the variable cache as used in the function g
> when called from the function f. In f the cache symbol to use is
> passed in as the second parameter z.
> f[a_, z_] := Block[{cache = z}, g[a]];
> g[a_] := (Print["hash" -> Hash[cache]]; cache[1] = a; cache[1]);
>
> Everything works as expected...
> Hash[z]
> 2065959314 (your number may be different)
>
> Calling f...
> f[1, z]
> hash->2065959314 (same)
> 1
>
> The symbol z now has a single downvalue...
> DownValues[z]
> {HoldPattern[z[1]] :> 1}
>
> However what if I actually want to use the symbol cache as the cache symbol...
>
> Hash[cache]
> 1028301578 (your number may be different)
>
> Calling f...
> f[1, cache]
> hash->1028301578 (same)
> 1
>
> Nothing stored in the cache this time?
> DownValues[cache]
> {}
>
> My theory is that Block[{cache = cache},... effectively localizes cache
> to a local temporary variable but that doesn't explain why I see the
> right Hash for the symbol inside g.
You are correct: when Block finishes, it restores the original 'cache',
and discards all definitions made to it inside of Block.