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

时间:2010-11-06 03:41:18

标签: wolfram-mathematica

在最近的两个问题(12)中,之前的海报试图控制Plus的输出顺序,这是一个Orderless函数。迈克尔·皮拉特indicated在内部Orderless函数Sort他们的参数造成了困难。但是,他告诫不要让Plus非 - Orderless。前两个问题的解决方案相当于创建一个显示Plus但不是Orderless本身的功能。这当然有效,但我的问题是我们如何更改默认的Sort订单?

1 个答案:

答案 0 :(得分:5)

我需要做更多的研究,但这有两种方式;问题是,您实际上并未使用Orderless属性。对于使用您引用的his answer to question 1条件的模式匹配技术,Simon应该获得半信誉。

OrderOrderedQSort混淆不会让你无处可去,因为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}}。

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