Ответ 1
Вот один из способов:
ClearAll[toInfixAlt];
SetAttributes[toInfixAlt, HoldAll];
toInfixAlt[expr_] :=
[email protected][Infix, HoldForm[expr]] //.
Infix[a : _?(Function[s, AtomQ[[email protected]], 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))]
Конец EDIT
Что касается лишних круглых скобок, их сложнее удалить, поскольку они часто необходимы из-за приоритета различных операторов, но должны быть возможны.
ИЗМЕНИТЬ 2
Чтобы позаботиться о приоритете, вот попытка:
ClearAll[toInfixAlt];
SetAttributes[toInfixAlt, HoldAll];
toInfixAlt[expr_] :=
[email protected][Infix, HoldForm[expr]] //.
Infix[a : _?(Function[s, AtomQ[[email protected]],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)]