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

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