*To*: mathgroup@smc.vnet.net*Subject*: [mg10516] Re: [mg10458] Impossible?*From*: David Withoff <withoff@wolfram.com>*Date*: Tue, 20 Jan 1998 02:23:03 -0500

> Hello, > > I would like to construct a function which gives me an absolute Level of > subexpression in expression. For example I want: > > a*(b+c*(d+AbsoluteLevelQ[e])) > > evaluate to > > Level[a*(b+c*(d+e)),e]. > ( AbsoiuteLevelQ climbs up until reaches In[], after that calls Level > ) > > More generally, I would like to control absolute level (level in respect > to In[%]) at which patter matching take place. For example if pattern > matches at Level n>3, then rule is applied, but if it matches at > Level n<3 then not. > > I suspect, that evaluation machinery here is hardly involved. Do > Mathematica language provides tools for such a control? Please comment > if solution don't exist. > > > > Arturas Acus > Institute of Theoretical > Physics and Astronomy > Gostauto 12, 2600,Vilnius > Lithuania > > > E-mail: acus@itpa.lt > Fax: 370-2-225361 > Tel: 370-2-612906 I think that for this function to be useful you will need to introduce a second function that defines where AbsoluteLevel should climb to. If AbsoluteLevel climbs through until it reaches the outermost level of evaluation, you would never be able to use it in a program, since it would climb right out through your program. With that second function, you could do this: In[1]:= AbsoluteLevel[___] := $AbsoluteLevel[0] In[2]:= _[___, $AbsoluteLevel[p_], ___] ^:= $AbsoluteLevel[p+1] In[3]:= AbsoluteLevelCatch[$AbsoluteLevel[p_]] ^:= p In[4]:= AbsoluteLevelCatch[ a*(b+c*(d+AbsoluteLevel[e]))] Out[4]= 4 If you really want this to just climb out to the outer level, you could do In[5]:= $Pre = AbsoluteLevelCatch ; In[6]:= a*(b+c*(d+AbsoluteLevel[e])) Out[6]= 4 Dave Withoff Wolfram Research