Re: Unevaluated Expression
- To: mathgroup at smc.vnet.net
- Subject: [mg26989] Re: Unevaluated Expression
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Tue, 30 Jan 2001 23:22:12 -0500 (EST)
- Organization: Universitaet Leipzig
- References: <955v6k$1i@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hermann Meier wrote: > > Dear Mathematica users, > > a = 10; > Unprotect[ToString]; SetAttributes[ToString, HoldAll] > ToString[a]//FullForm > gives (as desired) "a", not 10 > > Then I wanted to prevent the argument in f[x_] := x^2 from > getting evaluated. > > Attributes[f] = {HoldAll} > f[x_] := x^2 > f[Unevaluated[a]] > gives 100. If you don't want, that f[] gets evaluated why do you define rules for the evaluation ??? The definition: SetAttributes[f, HoldAll] f[x_Symbol] := (Print["huhu"]; x^2) f[x_?NumericQ] := x^2 and f[a] will Print[] "huhu" because a is left unevaluated (due to the attribute) and the a_Symbol pattern matches. While g[x_Symbol] := (Print["huhu1"]; x^2) g[x_?NumericQ] := x^2 and g[a] will a evaluate to 10 and use the second rule and no "huhu1" is printed. > > The longwinded code > ToExpression[ToString[f[a]], InputForm, Hold] /. Hold[f[nr_]] -> nr > or > First[Level[Composition[Hold][f[#]],{-1}]]& /@ {a,10} > > at least manages to give 10 instead of 100. > > Is there really no way to prevent the argument in f[x] from firing ? The argument isn't firing the right hand side of the rule f[x_]:= will replace your argument. you don't want that f[] is evaluated instead of an unevaluated argument. And Hold[f[a]] will work Regards Jens