Re: is Head[] part of the expression?
- To: mathgroup at smc.vnet.net
- Subject: [mg126950] Re: is Head[] part of the expression?
- From: Peter Breitfeld <phbrf at t-online.de>
- Date: Wed, 20 Jun 2012 03:48:13 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jrp91u$qbf$1@smc.vnet.net>
A way to get all functions with hat a specific option without yielding
errors could be:
Options[WhoHasOption]={Full->False};
WhoHasOption[option_, context_String : "System`*", OptionsPattern[]] :=
Module[{hA, langQ},
langQ = OptionValue[Full] === True;
hA = ToExpression /@
Quiet[Select[Names[context], MemberQ[ToExpression[#1,
StandardForm, Options[Unevaluated[#1]] &][[All, 1]],
option] &]];
If[langQ, {#, Options[#, option]} & /@ hA, hA]
]
usage is:
WhoHasOption[Heads]
If you want to see the setting of this Option, call:
WhoHasOption[Heads,Full->True]
If you want the functions of a specific context only, call:
WhoHasOption[Heads,"context`"]
Dana DeLouis wrote:
>> 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
>
>
>
--
_________________________________________________________________
Peter Breitfeld | Bad Saulgau, Germany | http://www.pBreitfeld.de