A function to evaluate only parts matching a pattern
- To: mathgroup at smc.vnet.net
- Subject: [mg25612] A function to evaluate only parts matching a pattern
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Mon, 16 Oct 2000 03:04:37 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
The function below evaluates all parts of a held expression that match a
certain pattern. This is based on some code Robby Villegas of Wolfram
Research discussed at the 1999 Developer Conference. There Micheal Trott and
Adam Strzebonski of Wolfram Research are mentioned as the inventors of this
trick discussed by Robby Villegas.
In[1]:=
EvaluatePattern[expr_,pattn_]:=
expr/.Pattern[p,pattn] :> With[{eval =p}, eval /; True]
I made it into a function and added (Pattern[p,pattn]). The nice part
is that there is no need to use Module[{p}, _]
-----------
The next cell creates a held expression and evaluates all sub expressions
with the Head Plus but nothing else evaluates. In this example
Erf[Infinity]+5, 1+3, 5+4, Sqrt[36]-Sqrt[16] evaluate to 6, 4, 9, 2
respectively since they each have the head Plus.
In[2]:=
demo=HoldForm[(Erf[Infinity]+5)*Sin[Pi/(1+3)]*Sqrt[5+4]/(Sqrt[36]-Sqrt[16])]
;
EvaluatePattern[demo,_Plus]
Out[3]=
HoldForm[(6*Sin[Pi/4]*Sqrt[9])/2]
Isn't that slick! Now this function doesn't work if any of the definitions
below are used. Why is the definition above the only one that works?
EvaluatePattern[expr_,pattn_]:=
expr/.Pattern[p,pattn]:>(p/;True)
EvaluatePattern[expr_,pattn_]:=
expr/.Pattern[p,pattn]:>With[{eval=p},eval]
EvaluatePattern[expr_,pattn_]:=
expr/.Pattern[p,pattn]->p
--------------------
Regards,
Ted Ersek
Down load Mathematica tips, tricks from
http://www.verbeia.com/mathematica/tips/Tricks.html