I don't mean this in the usual "we need to invent new symbols to make it clearer" way.
I mean it in the way that it has implicit typing that gets coerced constantly. Using Haskell types D :: (R -> R) -> (R -> R). Yet it gets used on things like D 2 = 0 which implies D :: (R -> R).
What you've actually done is an implicit conversion of 2 :: R to 2(x) = 2 :: R -> R and 0 is not 0::R it is 0(x) = 0 :: R -> R.
The Q_0 system described in [0] is a good start for a mathematical system that is both sane and as expressive as the one we have now. With term rewriting you can even keep the ridiculous notation we have today if you love it so much. Though I have grown incredibly fond of typing out extended typed lambda calculus using scheme notation in Emacs with a home grown automated theorem proving mode that was trivial to implement.