Re: is Head[] part of the expression?

*To*: mathgroup at smc.vnet.net*Subject*: [mg126946] Re: is Head[] part of the expression?*From*: Dana DeLouis <dana01 at me.com>*Date*: Tue, 19 Jun 2012 03:15:55 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com

> 2. If the Mathematica function does not like Heads option, > then do not use it (make a notes of such functions, should > not be many of them) Hi. Here's my attempt at finding such functions. In help for the function 'Names, there is an example for finding functions with certain Attributes. I could not find one for Options. Here's the best I came up with for now. I get a warning message with the output. Does anyone have a better idea for this code ?? Thanks. Here's my attempt. Find functions that have the option Heads -> True/False NamesWithOption[hd_]:=Module[{SysNames,Opt,Pos}, SysNames = Names["System`*"]; Opt=Options/@ToExpression[SysNames]; Pos=Position[Opt,hd,\[Infinity]][[All,1]]; SysNames[[Pos]]//ToExpression ] NamesWithOption[Heads] Options::opmix: Cannot mix streams and non-streams in {Courier,10.}. ToExpression::notstrbox: FEPrivate`FrontEndResourceString[GetFEKernelInit] is not .. . etc Output.. .. {Apply,Cases,Count,DeleteCases,Depth,FreeQ,Level, Map,MapAll,MapIndexed,MemberQ,Position,Replace,ReplacePart,Scan} Does anyone know of a better way to get this list ? Thanks. For the Op, one can temporarily change the default behavior... Options[Position] {Heads->True} SetOptions[Position,Heads->False] {Heads->False} Options[Position] {Heads->False} = = = = = = = = = = Dana DeLouis Mac & Math 8 = = = = = = = = = = On Jun 15, 3:35 pm, "Nasser M. Abbasi" <n... at 12000.org> wrote: > On 6/15/2012 11:53 AM, A. Retey wrote: > > > to get the expected behaviour, use an explicit level specification and Heads option, e.g.: > > > Position[{1, 2, 3}, _, {1}, Heads -> False] > > That is good option to use. But it does not seem to be accepted > by all functions: > > -------------------------------- > mat = {{0, 0, 1}, {10, 0, 2}, {3, 4, 0}}; > sp = SparseArray[mat]; > pos = sp["NonzeroPositions", Heads -> False] (*does NOT work*) > --------------------------------- > > but > > ------------------------------------ > pos=sp["NonzeroPositions"] (*works*) > Out[46]= {{1,3},{2,1},{2,3},{3,1},{3,2}} > --------------------------------- > > and > > -------------------------- > v1 = {a, b, c}; > v2 = {e, f, g}; > Outer[Times, v1, v2, Heads -> False] (*error*) > ----------------------- > > and > > ------------------------------------- > A = {{50, 75, 0}, {50, 0, 100}, {0, 75, 100}, > {75, 100, 0}, {0, 75,100}, {0, 75, 100}}; > > ReplacePart[A, > DeleteDuplicates[ > Position[A, _?(# != 0 &)], (#1[[1]] == #2[[1]] &)] -> -1, > Heads -> False] (*ok*) > ----------------------------------- > > > Whether Heads are looked at and which levels are looked at by default depends > >on the function you use, there is no common convention that they all behave > >the same. This seems o.k. since there is a different useful default > >depending on what these functions do. I found it saved me from many > >surprises and made my code more robust to include explicit level > >specifications as much as I can... > > > hth, > > > albert > > So, I guess the rule of thumb I'll add to my cheat sheet is like this: > > 1. Add Heads -> False always (unless I really want to look at Head, not likely) > 2. If the Mathematica function does not like Heads option, > then do not use it (make a notes of such functions, should > not be many of them) > > I just think this now adds a bit more complexity if one has to > worry about the Head of the expression being part of the > expression. I think Head of expression should not be > looked at, unless by explicit call or explicit option. > > Thanks to all the replies. > > thanks, > > --Nasser