
On May 1, 2020, at 15:35, Steven D'Aprano <steve@pearwood.info> wrote:
but if it is all functions, then I think you have no choice but to either live with it or shift languages, because the syntax for functions is too deeply baked into Python to change now.
Actually, I’m pretty sure Python could add infix calling without complicating the grammar much, or breaking backward compatibility at all. I don’t think it *should*, but maybe others would disagree. The most obvious way to do it is borrowing straight out of Haskell, so this: x `spam` y … compiles to exactly the same code as this: spam(x, y) That should be a very easy change to the grammar and no change at all to the later stages of compiling, so it’s about as simple as any new syntax could be. It doesn’t get in the way of anything else to the parser—and, more importantly, I don’t think it’s confusable as meaning something else to humans. (Of course it would be one extra thing to learn, like any syntax change.) Maybe something like $ instead of backticks is better for people with gritty monitors, but no point bikeshedding that (or the precedence) unless the basic idea is sound. Anyway, it’s up to the user to decide which binary functions to infix and which to call normally, which sounds like a consenting-adults issue, but… does it _ever_ look Pythonic? For this particular use case: isa = isinstance thing `isa` Fruit and not thing `isa` Apple … honestly, the lack of any parens here makes it seem harder to read, even if it is a bit closer to English. Here’s the best use cases I can come up with: xs `cross` ys array([[0,1], [1,1]]) `matrix_power` n prices `round` 2 These are all things I have written infix in Haskell, and can’t in Python/NumPy, so you’d think I’d like the improvement… but if I can’t have real operators, I think I want dot-syntax methods with parens instead in Python: prices.round(2) And outside of NumPy, the examples seem to just get worse: with open(path, 'w') as f: obj `json.dump` f Of course maybe I’m just failing to imagine good examples.