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