Re: setdelayed function
- To: mathgroup at smc.vnet.net
- Subject: [mg27978] Re: setdelayed function
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Tue, 27 Mar 2001 01:26:14 -0500 (EST)
- References: <99n5kd$igv@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Your use of SetDelayed is correct: it prevents the right side of the
following evaluating
p:=28^2+300^2-2*28*300*Cos[40 Degree]
?p
Global`p
p := 28^2 + 300^2 - 2*28*300*Cos[40*Degree]
However, we need to to prevent the evaluation of p within test1[p]. So
give test1 the attribute HoldFirst.
SetAttributes[test1, HoldFirst];
Unfortunately this is still not good enough s
test1[x_]:=Level[Unevaluated[x],1]
test1[p]
{}
This is because we end up evaluating Level[Unevaluated[p],1].
We need to use the value of p without evaluating it.
This can be done by using
OwnValues[p]
{HoldPattern[p] :> 28^2 + 300^2 -
2*28*300*Cos[40*Degree]}
Thus
test1[x_]:=Level[Hold[x]/.OwnValues[x],{2}]
test1[p]
{784, 90000, -16800 Cos[40 Degree]}
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Pek" <phsoh at alum.mit.edu> wrote in message news:99n5kd$igv at smc.vnet.net...
> Hi,
> I am trying the setdelayed function but I didn't understand why the
> solution differs between the two methods below:
>
> Method 1 with setdelayed
> In[4]:=
> p := 28^2 + 300^2 - 2*28*300*Cos[40 Degree]
>
> In[2]:=
> test1[x_] := Level[Unevaluated[x], 1]
>
> In[5]:=
> test1[p]
>
> Out[5]=
> {90784, -16800 Cos[40 Degree]}
>
> Method 2 without setdelayed
> In[9]:=
> Level[Unevaluated[28^2 + 300^2 - 2*28*300*Cos[40 Degree]], 1]
>
> Out[9]=
> {784, 90000, -16800 Cos[40 Degree]}
>
>
> Finally, Out[9] is what is I wanted but I would like to get this
> result using setdelayed. Did I use setdelayed incorrectly?
>
> Would really appreciate your help.
>
> Thanks.
>
> Pek
>
>