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.