MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Odd edge-case behavior of Block


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.




  • Prev by Date: Re: CUDALink is not initialized
  • Next by Date: Re: how to set initial values to symbolic variable array?
  • Previous by thread: Odd edge-case behavior of Block
  • Next by thread: Primes e Regex