Infix[]
仅适用于第一级:
Infix[(c a^b)^d]
(*
-> (a^b c) ~Power~ d
*)
因为我想(不要问为什么)将完整的表达式切换为中缀符号,我尝试了类似的东西:
SetAttributes[toInfx, HoldAll];
toInfx[expr_] := Module[{prfx, infx},
prfx = Level[expr, {0, Infinity}];
infx = Infix /@ prfx /. {Infix[a_Symbol] -> a, Infix[a_?NumericQ] -> a};
Fold[ReplaceAll[#1, #2] &, expr, Reverse@Thread[Rule[prfx, infx]]]
]
k = toInfx[(c a^b)^d]
(*
-> (c ~Times~ (a ~Power~ b)) ~Power~ d
*)
但这有两个明显的问题,因为
(c a^b)^d == a~Power~b~Times~c~Power~d
k = toInfx[a/b + ArcTan[a/b]]
是否有一种简单的方法让Infix[]
为所有人(离开)工作?
答案 0 :(得分:6)
这是一种方式:
ClearAll[toInfixAlt];
SetAttributes[toInfixAlt, HoldAll];
toInfixAlt[expr_] :=
First@MapAll[Infix, HoldForm[expr]] //.
Infix[a : _?(Function[s, AtomQ[Unevaluated@s], HoldAll]) | _[_]| _[]] :> a
我使用HoldForm
,因为您可能希望代码保持未评估状态。这是一个例子:
In[781]:= toInfixAlt[(c a^b)^d/(1/2)]
Out[781]= ((c ~Times~ (a ~Power~ b)) ~Power~ d) ~Times~ (1/((1/2)))
修改的
和
In[792]:= toInfixAlt[a/b+ArcTan[a/b]]
Out[792]= (a ~Times~ (b ~Power~ (-1))) ~Plus~ ArcTan[a ~Times~ (b ~Power~ (-1))]
结束编辑
对于多余的括号,删除它们比较困难,因为由于各种操作符的优先级,它们确实需要它们,但应该是可能的。
编辑2
为了处理优先顺序,这是一次尝试:
ClearAll[toInfixAlt];
SetAttributes[toInfixAlt, HoldAll];
toInfixAlt[expr_] :=
First@MapAll[Infix, HoldForm[expr]] //.
Infix[a : _?(Function[s, AtomQ[Unevaluated@s],HoldAll]) | _[_] | _[]] :> a //.
{
Infix[f_[a__, Infix[r : (h_[___])],b___]] /;
Precedence[Unevaluated[f]] <= Precedence[Unevaluated[h]] :> Infix[f[a, r, b]],
Infix[b___,f_[Infix[r : (h_[___])], a__]] /;
Precedence[Unevaluated[f]] <= Precedence[Unevaluated[h]] :> Infix[f[b, r, a]]
};
现在,我明白了:
In[963]:= toInfixAlt[a/b+ArcTan[a/b]]
Out[963]= (a b ~Power~ (-1)) ~Plus~ ArcTan[a ~Times~ (1/b)]
答案 1 :(得分:3)
这是我的方法,与列昂尼德非常相似:
(* In[118]:= *) foo[a:_[_,__]]:=Infix[a]
foo[a_]:=a
(* In[120]:= *) MapAll[foo,(c a^b)^d]
(* Out[120]= *) (c ~Times~ (a ~Power~ b)) ~Power~ d
(* In[121]:= *) MapAll[foo,a/b+ArcTan[a/b]]
(* Out[121]= *) ArcTan[a ~Times~ (b ~Power~ (-1))] ~Plus~ (a ~Times~ (b ~Power~ (-1)))
答案 2 :(得分:2)
我不知道为什么我会帮你取笑我,但是......
(c a^b)^d //. h_[a_, b_] :> ix[a, h, b] /. ix :> (Infix[{##}, "~"] &)