在最近的两个问题(1,2)中,之前的海报试图控制Plus
的输出顺序,这是一个Orderless
函数。迈克尔·皮拉特indicated在内部Orderless
函数Sort
他们的参数造成了困难。但是,他告诫不要让Plus
非 - Orderless
。前两个问题的解决方案相当于创建一个显示Plus
但不是Orderless
本身的功能。这当然有效,但我的问题是我们如何更改默认的Sort
订单?
答案 0 :(得分:5)
我需要做更多的研究,但这有两种方式;问题是,您实际上并未使用Orderless
属性。对于使用您引用的his answer to question 1条件的模式匹配技术,Simon应该获得半信誉。
与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]
如果参数的顺序不是所需的顺序,则评估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]
这两种方法存在一些问题,例如,特定的$Pre
功能与例如HoldForm[g[1,2,3]]
功能无关。 {{1}}。
所以,这就是现在可以玩的东西。我希望在对此进行更多研究后进行更新。