I've used the following code to simulate defining operations between functions:
ThroughFunctions[expr_] := expr//.{
x_?NumericQ[___] -> x,
(f_/;MemberQ[Attributes[f], NumericFunction])[x___][y___] :> Through[f[x][y]]
}
$Pre = ThroughFunctions;
Since it's assigned to $Pre the substitution occurs without having to wrap the expressions in the function ThroughFunctions:
In[10]:=(Cos^2/(3+Sin))[x]
Out[10]=Cos[x]^2/(3+Sin[x])
The problem with this is that it doesn't work when I try to use it in an expression that delays the evaluation:
Plot[(Sin + Cos^2)[x], {x, 0, Pi}]
returns an empty graphic.
Is there a way to implement this in a more robust way so it works better?

Log[Cos[x]],x + Sin[x], andE^Sin[x](or2^Sin[x],x^x,...)? – Michael E2 Apr 15 '21 at 19:33Id = Identityfor brevity, I would enter those expression like this:Log[Cos][x],(Id+Sin)[x],(E^Sin)[x],(2^Sin)[x],(Id^Id)[x]– jjagmath Apr 15 '21 at 20:47Log[Cos] alias xthat would look likeLog[Cos] @ xbut would use your evaluation function. – Carl Woll Apr 15 '21 at 21:24Map[Sin + Cos, Range[5]]to give{Sin[1]+Cos[1],...,Sin[5]+Cos[5]}? That seems a different problem than rewriting input. I don't think any$Premethod would work on this. – Michael E2 Apr 15 '21 at 22:01Map[..]) is evaluating before the transformation inThroughFunctionsis applied, since its arguments are not held. This is the reasonPlot[]fails: it is evaluated before the replacement. I don't think a robust solution can operate on the expression after it has been evaluated. If you want(Sin + Cos)[x]to evaluate toSin[x] + Cos[x]whether it is on input or the result of an intermediate computation, I don't know how that could be done. It could be done with a wrapper likefunc[Sin + Cos][x], by definingfunclikeThroughFunctions. – Michael E2 Apr 15 '21 at 22:28