Infix[]
работает только на первом уровне:
Infix[(c a^b)^d]
(*
-> (a^b c) ~Power~ d
*)
Как я хочу (не спрашивайте почему), чтобы полное выражение переключилось на нотацию infix, я попробовал что-то вроде:
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, [email protected][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[]
работу для All (leaves)?