Re: delayed rule evaluation order
- To: mathgroup at smc.vnet.net
- Subject: [mg68007] Re: [mg67967] delayed rule evaluation order
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Thu, 20 Jul 2006 06:04:48 -0400 (EDT)
- References: <11710934.1153306359682.JavaMail.root@eastrmwml07.mgt.cox.net> <acbec1a40607190514x62d0f07byeb91cf8b496bca33@mail.gmail.com> <3BA57237-C0B6-4C71-A8B0-3481DCDBC464@mimuw.edu.pl> <acbec1a40607190919p3efa8b30x4ae0cb6278444931@mail.gmail.com> <330E5DE6-73D2-4844-BACD-8D96B736EA76@mimuw.edu.pl>
- Sender: owner-wri-mathgroup at wolfram.com
Here is another way, which you may like better. It uses the blah
approach and the Trott-Strzebonski partial evaluation technique.
f[1] = 1;
f[n_Integer] /; n > 1 = n f[n - 1];
InputForm[z = Trace[f[2]]];
v = z /. {blah_?ExactNumberQ :> SetPrecision[blah, 3]};
v/.p_SetPrecision:> With[{eval = p}, eval /; True]
{2.00,{2.00>1.00,True},2.00,{{1.00,1.00},1.00,1.00},2.00,2.00}
This must be finally what you wanted, isn't it?
Andrzej Kozlowski
On 19 Jul 2006, at 18:50, Andrzej Kozlowski wrote:
> It's much easier to answer questions if the persons who pose them
> explain clearly what they mean.
>
> The most obvious way to modify my code seems to me to be:
>
>
> f[1] = 1;
> f[n_Integer] /; n > 1 = n f[n - 1];
> InputForm[z = Trace[f[2]]];
>
>
> Block[{f=g},z/.{HoldForm[a_]:>HoldForm@@{SetPrecision[a,3]}}]/.g->f
>
>
> {f(2.00),{True,True},2.00 f(1.00),{{1.00,1.00},f(1.00),1.00},
> 2.00,2.00}
>
> Now f is not evaluated. The only thing you might still complain
> about is that {2 > 1, True} evaluated to {True,True}. If you really
> care about this you, can prevent it in various ways, for example:
>
>
> Block[{f=g},
> z/.{HoldForm[a_]/;
> FreeQ[a,True]:>HoldForm@@{SetPrecision[a,3]}}]/.g->f
>
>
> {f(2.00),{2>1,True},2.00 f(1.00),{{1.00,1.00},f(1.00),1.00},2.00,2.00}
>
> or
>
>
> Block[{f=g,Greater=greater},
> z/.{HoldForm[a_]/;
> FreeQ[a,True]:>HoldForm@@{SetPrecision[a,3]}}]/.{g->f,greater-
> >Greater}
>
>
> {f(2.00),{2.00>1.00,True},2.00 f(1.00),{{1.00,1.00},f(1.00),1.00},
> 2.00,2.00}
>
>
> There are many other possibilities.
> If there is still anything you do not like than it probably means
> you still have not explained completely what you want.
>
> Andrzej Kozlowski
>
> On 19 Jul 2006, at 18:19, Chris Chiasson wrote:
>
>>
>> What I want it to do is be able to replace numbers that aren't direct
>> arguments of HoldForm (maybe they are nested a few levels deep, etc).
>>
>> In the example you sent me, f is evaluated - which is undesirable
>> for me.
>>
>> On 7/19/06, Andrzej Kozlowski <akoz at mimuw.edu.pl> wrote:
>>> (tm) Pro*
>>> It seems to me that a variant of my first suggestion works fine:
>>>
>>> In[1]:=
>>> f[1]=1;
>>> f[n_Integer]/;n>1=n f[n-1];
>>> InputForm[z=Trace[f[2]]];
>>> InputForm[z/.{HoldForm[a_]:>HoldForm@@{SetPrecision[a,3]}}]
>>>
>>> Out[4]//InputForm=
>>> {HoldForm[2.`2.9999999999999973],
>>> {HoldForm[True], HoldForm[True]},
>>> HoldForm[2.`2.9999999999999973],
>>> {{HoldForm[1.`2.9999999999999973],
>>> HoldForm[1.`2.9999999999999973]},
>>> HoldForm[1.`2.9999999999999973],
>>> HoldForm[1.`2.9999999999999973]},
>>> HoldForm[2.`2.9999999999999973],
>>> HoldForm[2.`2.9999999999999973]}
>>>
>>> Or is this not what you wanted?
>>>
>>> Andrzej Kozlowski
>>>
>>>
>>>
>>> On 19 Jul 2006, at 14:14, Chris Chiasson wrote:
>>>
>>> > Thanks to Kozlowski's, Hanlon's and Pein's solutions (haven't
>>> received
>>> > any others so far), I am now using this type of replacement:
>>> >
>>> > Hold[5.55555555]/.{blah_?InexactNumberQ:>
>>> > junk[SetPrecision[blah,3]]}/.junk->Evaluate
>>> >
>>> > Hold[5.56]
>>> >
>>> > However, this still does not totally work on Trace's output:
>>> >
>>> > In[1]:=
>>> > f[1]=1;
>>> > f[n_Integer]/;n>1=n f[n-1];
>>> > InputForm[z=Trace[f[2]]]
>>> >
>>> > Out[3]//InputForm=
>>> > {HoldForm[f[2]], {HoldForm[2 > 1], HoldForm[True]}, HoldForm[2*f
>>> [-1
>>> > + 2]],
>>> > {{HoldForm[-1 + 2], HoldForm[1]}, HoldForm[f[1]], HoldForm[1]},
>>> > HoldForm[2*1], HoldForm[2]}
>>> >
>>> > In[4]:=
>>> > InputForm[z/.{blah_?ExactNumberQ:>junk[SetPrecision[blah,
>>> 3]]}/.junk-
>>> > >Evaluate]
>>> >
>>> > Out[4]//InputForm=
>>> > {HoldForm[2.`2.9999999999999996], {HoldForm[Evaluate
>>> [SetPrecision[2,
>>> > 3]] > Evaluate[SetPrecision[1, 3]]],
>>> > HoldForm[True]}, HoldForm[2.`2.9999999999999996],
>>> > {{HoldForm[1.`2.9999999999999996], HoldForm
>>> [1.`2.9999999999999996]},
>>> > HoldForm[1.`2.9999999999999996],
>>> > HoldForm[1.`2.9999999999999996]}, HoldForm
>>> [2.`2.9999999999999996],
>>> > HoldForm[2.`2.9999999999999996]}
>>> >
>>> > Notice the leftover Evaluate and SetPrecision commands. Does
>>> anyone
>>> > have ideas on how to get this to work?
>>> >
>>> > On 7/19/06, Bob Hanlon <hanlonr at cox.net> wrote:
>>> >> Hold[{2, 3}] /.
>>> >> {Hold[{x_, y_}] :> Hold[Evaluate[x^y]]}
>>> >>
>>> >> Hold[8]
>>> >>
>>> >>
>>> >> Bob Hanlon
>>> >>
>>> >> ---- Chris Chiasson <chris at chiasson.name> wrote:
>>> >> > Hold[{2, 3}] /. {{x_, y_} :> x^y}
>>> >> >
>>> >> > the result is Hold[Power[2,3]]
>>> >> >
>>> >> > I would like the result to be Hold[8]
>>> >> >
>>> >> > The original context is post-processing of a large Trace output
>>> >> (via
>>> >> > SetPrecision to get rid of digits and improve readability).
>>> >> >
>>> >> > Any ideas?
>>> >> >
>>> >> > --
>>> >> > http://chris.chiasson.name/
>>> >> >
>>> >>
>>> >> --
>>> >>
>>> >> Bob Hanlon
>>> >> hanlonr at cox.net
>>> >>
>>> >>
>>> >>
>>> >
>>> >
>>> > --
>>> > http://chris.chiasson.name/
>>>
>>>
>>
>>
>> --
>> http://chris.chiasson.name/
>