MathGroup Archive 2005

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

Search the Archive

Re: A ToExpression question

  • To: mathgroup at
  • Subject: [mg58351] Re: [mg58316] A ToExpression question
  • From: Andrzej Kozlowski <andrzej at>
  • Date: Tue, 28 Jun 2005 21:56:48 -0400 (EDT)
  • References: <>
  • Sender: owner-wri-mathgroup at

On 28 Jun 2005, at 18:13, 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 ?

To analyze this we need a more explicit model for the commonly used  


I believe that, with the above definition,  when you evaluate f[u]  
you get


So using this model let's first consider f2[0]. This is


However, there is nothing to match x in the unevaluated ToExpression 
["Print[x]"] , ("Print[x]" is a string so the x is not matched) hence  
the replacement has no effect and x is printed.

Now consider f4[0]. This is:

Unevaluated[Block[{y = x}, ToExpression["Print[y]"]]]/.HoldPattern[x]->0

This time we get

Block[{y = 0}, ToExpression["Print[y]"]]]

Now the evaluation of ToExpression["Print[y]"]] proceeds with the  
value of y  set to 0, so first ToExpression["Print[y]"]] is evaluated  
to Print[y] and then 0 is printed.

Finally, consider f3[0]. This gives

Unevluated[Module[{y = x}, ToExpression["Print[y]"]]]]/.HoldPattern 

This is turned into


but unlike in the case of Block, before evaluation y is renamed as y 
$somenumber but of course the y in "Print[y]" is not renamed since it  
is still a part of a string. So in effect we get

Block[{y$somenumber=0},ToExpression["Print[y]"]]] and of course this  
will print y and not 0.

Andrzej Kozlowski
Chiba, Japan

  • Prev by Date: (presumably) easy AspectRatio question
  • Next by Date: Re: fitting a function
  • Previous by thread: A ToExpression question
  • Next by thread: Re: A ToExpression question