覆盖无顺序功能的默认显示顺序

rco*_*yer 8 wolfram-mathematica

在最近的两个问题(1,2),上一海报试图控制的输出顺序Plus,这是一个Orderless功能.迈克尔皮拉特表示,在内部,他们的参数Orderless功能Sort导致了困难.但是,他告诫不要做PlusOrderless.前两个问题的解决方案相当于创建一个显示Plus但不是Orderless本身的功能.这肯定是有效的,但我的问题是我们如何更改默认Sort订单?

Mic*_*lat 5

我需要做更多的研究,但这有两种方式; 问题是,您实际上并未使用该Orderless属性.对于使用模式匹配的技巧,西蒙应该获得一半的功劳,他的回答是你引用的问题1.

弄乱Order,OrderedQ并且Sort不会让你到任何地方,因为Orderless函数排序与这些方法等效,但实际上并没有它们排序.

从Simon的回答中,第一种方法是使用Condition:

In[1]:= ClearAll[f, g]

In[2]:= f[stuff__] /; ! OrderedQ[{stuff}, Greater] := 
           f[Sequence@@Sort[{stuff}, Greater]]

In[3]:= f[1, 2, 3]
Out[3]= f[3, 2, 1]

In[4]:= f[3, 2, 1]
Out[4]= f[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

如果参数的顺序不是所需的顺序,则评估f [stuff __]的定义,然后转换为该顺序.

另一种技术是使用更低级别并使用$Pre$PreRead:

In[5]:= $Pre = 
 Function[{expr}, 
  expr /. g[stuff__] :> g[Sequence @@ Sort[{stuff}, Greater]]];

In[6]:= g[1, 2, 3]
Out[6]= g[3, 2, 1]

In[7]:= g[3, 2, 1]
Out[7]= g[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

这两种方法都存在一些问题,例如,特定$Pre功能不能很好地发挥作用HoldForm[g[1,2,3]].

所以,这是现在可以玩的东西.我希望在对此进行更多研究后进行更新.