 
 
 
 
 
 
Re: A ToExpression question
- To: mathgroup at smc.vnet.net
- Subject: [mg58341] Re: A ToExpression question
- From: dh <dh at metrohm.ch>
- Date: Tue, 28 Jun 2005 21:56:40 -0400 (EDT)
- References: <d9r4h4$53i$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi Ray,
A function does replace its dummy arguments by the actual arguments 
before it evaluates the body. Values insides strings are not replaced. 
Therefore, f2 prints x because it has not been replaced. f3 prints y 
because Module renames y by y$nnn and gives it the value x, but the 
replacement is not done inside the string. Here we still have y that has 
no value and prints as "y". On the contrary, Block does not rename local 
variables, it keeps the name, but temporaraily gives it the value of x. 
Therefore, Print[y] prints 0 because y has temporarily the value 0.
sincerely, Daniel
Ray Koopman wrote:
> f1[x_] := Print[x];
> f2[x_] := ToExpression["Print[x]"];
> f3[x_] := Module[{y = x}, ToExpression["Print[y]"]];
> f4[x_] :=  Block[{y = x}, ToExpression["Print[y]"]];
> 
> Scan[#[0]&,{f1,f2,f3,f4}]
> 
> 0
> x
> y
> 0
> 
> Why don't f2 and f3 print 0 ?
> 

