MathGroup Archive 1999

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

Search the Archive

Re: Orderless indexed functions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg20890] Re: [mg20874] Orderless indexed functions
  • From: Hartmut Wolf <hwolf at debis.com>
  • Date: Sat, 20 Nov 1999 01:07:04 -0500 (EST)
  • Organization: debis Systemhaus
  • References: <199911190146.UAA01488@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

N Monomachoff schrieb:
> 
> Hello,
> 
> I need to use 'indexed functions' like f[0][x__] and f[1][x__].
> It's important that the functions be Orderless, but
> 
> SetAttributes[f[0],Orderless]
> 
> isn't accepted because f[0] isn't a symbol, and
> 
> SetAttributes[f,Orderless]
> 
> doesn't affect the ordering in the second set of brackets.
> How does one make a nonsymbolic head orderless?
> 
Dear N Monomachoff,

I don't know, and if someone does, then please forget these tricks:

(1) use an ancillary symbol

This can be used when you define your function. Wrap the definition
(SetDelayed) in makeOrderless and that definition will be attached to an
(invisible) Symbol *that* is made Orderless. The rule for your function
just leads to that symbol.

In[1]:= SetAttributes[makeOrderless, HoldAll]
In[2]:=
makeOrderless[sym_Symbol[tags___][cseq___] := rhs_] :=
Block[{newSymbol},
    SetAttributes[Evaluate[newSymbol = Unique[sym]], Orderless];
    Evaluate[newSymbol][cseq] := rhs;
    sym[tags] = newSymbol ;]
In[3]:=
makeOrderless[f[7][x___] := Print[x]]
In[4]:=
makeOrderless[f[8][x___] := dontPrint[x]]
In[5]:=
f[7][7, 3, 4, 5, 1]
1\[InvisibleSpace]3\[InvisibleSpace]4\[InvisibleSpace]5\[InvisibleSpace]7
In[6]:=
f[8][7, 3, 4, 5, 1]
Out[6]=
dontPrint[1, 3, 4, 5, 7]
In[7]:=
?f
"Global`f"
\!\(\*
  InterpretationBox[GridBox[{
        {GridBox[{
              {\(f[7] = f$5\)},
              {" "},
              {\(f[8] = f$6\)}
              },
            GridBaseline->{Baseline, {1, 1}},
            ColumnWidths->0.999,
            ColumnAlignments->{Left}]}
        },
      GridBaseline->{Baseline, {1, 1}},
      ColumnAlignments->{Left}],
    Definition[ f],
    Editable->False]\)
In[8]:=
?f$*
f$5 f$6
In[9]:=
?f$5
"Global`f$5"
\!\(\*
  InterpretationBox[GridBox[{
        {\(Attributes[f$5] = {Orderless}\)},
        {" "},
        {GridBox[{
              {\(f$5[x___] := Print[x]\)}
              },
            GridBaseline->{Baseline, {1, 1}},
            ColumnWidths->0.999,
            ColumnAlignments->{Left}]}
        },
      GridBaseline->{Baseline, {1, 1}},
      ColumnAlignments->{Left}],
    Definition[ f$5],
    Editable->False]\)
In[10]:=
?f$6
"Global`f$6"
\!\(\*
  InterpretationBox[GridBox[{
        {\(Attributes[f$6] = {Orderless}\)},
        {" "},
        {GridBox[{
              {\(f$6[x___] := dontPrint[x]\)}
              },
            GridBaseline->{Baseline, {1, 1}},
            ColumnWidths->0.999,
            ColumnAlignments->{Left}]}
        },
      GridBaseline->{Baseline, {1, 1}},
      ColumnAlignments->{Left}],
    Definition[ f$6],
    Editable->False]\)
In[11]:=
DownValues[f]
Out[11]=
{HoldPattern[f[7]] :> f$5, HoldPattern[f[8]] :> f$6}



(2) another idea

If you have already defined your functions, or if you do not want to
attach definitions to them (e.g. you use them only as containers or as a
datatype) then just define

In[12]:=
g[5][x___] /; ! OrderedQ[{x}] := Apply[g[5], Sort[{x}]]
In[13]:=
g[5][7, 3, 4, 5, 1]
Out[13]=
g[5][1, 3, 4, 5, 7]

Kind regards, Hartmut


  • Prev by Date: RE: Question on plotting parametric surfaces
  • Next by Date: Re: Question on plotting parametric surfaces
  • Previous by thread: Re: Orderless indexed functions
  • Next by thread: Re: Orderless indexed functions