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.