Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1995
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1995

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Crossreference, code documentation

  • To: mathgroup at christensen.cybernetics.net
  • Subject: [mg1633] Re: Crossreference, code documentation
  • From: Count Dracula <lk3a at kelvin.seas.virginia.edu>
  • Date: Fri, 7 Jul 1995 01:33:09 -0400
  • Organization: University of Virginia

In Message-ID: <3tahhp$6bb at news0.cybernetics.net> 
wagner at bullwinkle.cs.Colorado.EDU (Dave Wagner) writes:

> This function finds all symbols in an
> expression without allowing anything to evaluate:
> 
> 	SetAttributes[FindSymbols, HoldFirst]
> 	FindSymbols[expr_] :=
> 	Switch[Head[Unevaluated[expr]],
> 	    String | Integer | Real | Complex | Rational, {},
> 	    Symbol, {HoldForm[expr]},
> 	    _,  Union[Flatten[ReleaseHold[
> 				Map[FindSymbols,
> 				    Apply[List, Hold[expr], {1}],
> 				    {2}] ]],
> 		      FindSymbols @@ HeldPart[Hold[expr], 1, 0]
> 		]
> 	]
> 

This functionality is more simply achieved, without resorting to
recursion, by the function  findsym  :

-----------------------------------------------------------------------------------
  SetAttributes[{findsym, WrapAll}, HoldAll]

  findsym[expr_] := Union[ Cases[Level[WrapAll[expr], {0, Infinity}, Heads -> True],
                          Hold[x_Symbol] :> HoldForm[x]] ]
 
  WrapAll[expr_] := First[Map[ Hold, Hold[expr], Infinity, Heads -> True ]]
------------------------------------------------------------------------------------

For example:

In[2]:= findsym[1/0]

Out[2]= {Power, Times}

In[3]:= FindSymbols[1/0]

Out[3]= {Power, Times}

In[4]:= {a, b, c, f, g} = {1, 2, 3, func1, func2};

In[5]:= Timing[FindSymbols[f[a][b, g[c]]]]

Out[5]= {0.01 Second, {a, b, c, f, g}}

In[6]:= Timing[findsym[f[a][b, g[c]]]]

Out[6]= {0. Second, {a, b, c, f, g}}

In[7]:= test := findsym[P[{x, f[f[g[a], b], b, h[c], f]}] + 
    Sin[x + Pi y] Log[c] Exp[I x + u]/(9 Integrate[Pi x, {x, 0, 2}])]

In[8]:= test2 := FindSymbols[P[{x, f[f[g[a], b], b, h[c], f]}] + 
    Sin[x + Pi y] Log[c] Exp[I x + u]/(9 Integrate[x Pi, {x, 0, 2}])]

In[9]:= Timing[test2]

Out[9]= {0.05 Second, {a, b, c, Exp, f, g, h, I, Integrate, List, Log, P, Pi, Plus, Power, Sin, Times, u, x, y}}

In[10]:= Timing[test]

Out[10]= {0.01 Second, {a, b, c, Exp, f, g, h, I, Integrate, List, Log, P, Pi, Plus, Power, Sin, Times, u, x, y}}

In[11]:= FindSymbols[Infinity/0 + "string"/0 + (3 + I u)/Infinity]

Out[11]= {I, Infinity, Plus, Power, Times, u}

In[12]:= findsym[Infinity/0 + "string"/0 + (3 + I u)/Infinity]

Out[12]= {I, Infinity, Plus, Power, Times, u}

In[13]:= findsym[Exit]

Out[13]= {Exit}

In[14]:= FindSymbols[Exit]

Out[14]= {Exit}

-- 
 ___________________________________________________________________________________
 Levent Kitis           lk3a at cars.mech.virginia.edu    lk3a at kelvin.seas.virginia.edu
 University of Virginia Department of Mechanical, Aerospace, and Nuclear Engineering  
 ___________________________________________________________________________________


  • Prev by Date: Strange result from Mma Series [...]
  • Next by Date: Re: Printing Problem
  • Previous by thread: Re: Crossreference, code documentation
  • Next by thread: Re: Re: Crossreference, code documentation