Вот один из способов:
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)))
EDIT
и
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)]