On Tue, Jun 9, 2020 at 8:11 PM Guido van Rossum <guido@python.org> wrote:
In Python 3.10 we will no longer be burdened by the old parser (though 3rd party tooling needs to catch up).

One thing that the PEG parser makes possible in about 20 lines of code is something not entirely different from the old print statement. I have a prototype:

Python 3.10.0a0 (heads/print-statement-dirty:5ed19fcc1a, Jun  9 2020, 16:31:17)
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Cannot read termcap database;
using dumb terminal settings.
>>> print 2+2
4
>>> print "hello world"
hello world
>>> print "hello", input("Name:")
Name:Guido
hello Guido
>>> print 1, 2, 3, sep=", "
1, 2, 3
>>>


But wait, there's more! The same syntax will make it possible to call *any* function:

>>> len "abc"
3
>>>

Or any method:

>>> import sys
>>> sys.getrefcount "abc"
24
>>>


Really, *any* method:

>>> class C:
...   def foo(self, arg): print arg
...
>>> C().foo 2+2
4
>>>


There are downsides too, though. For example, you can't call a method without arguments:

>>> print
<built-in function print>
>>>


Worse, the first argument cannot start with a parenthesis or bracket:

>>> print (1, 2, 3)
1 2 3
>>> C().foo (1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: C.foo() takes 2 positional arguments but 4 were given
>>> print (2+2), 42
4
(None, 42)
>>> C().foo [0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'method' object is not subscriptable
>>>

No, it's not April 1st. I am seriously proposing this (but I'll withdraw it if the response is a resounding "boo, hiss"). After all, we currently have a bunch of complexity in the parser just to give a helpful error message to people used to Python 2's print statement:

Boo! Hiss!
 
>>> print 1, 2, 3
  File "<stdin>", line 1
    print 1, 2, 3
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(1, 2, 3)?
>>>


And IIRC there have been a number of aborted attempts at syntactic hacks to allow people to call functions (like print) without parentheses, although (I think) none of them made it into a PEP. The PEG parser makes this much simpler, because it can simply backtrack -- by placing the grammar rule for this syntax (tentatively called "call statement") last in the list of alternatives for "small statement" we ensure that everything that's a valid expression statement (including print() calls) is still an expression statement with exactly the same meaning, while still allowing parameter-less function calls, without lexical hacks. (There is no code in my prototype that checks for a space after 'print' -- it just checks that there's a name, number or string following a name, which is never legal syntax.)

One possible extension I didn't pursue (yet -- dare me!) is to allow parameter-less calls inside other expressions. For example, my prototype does not support things like this:

>>> a = (len "abc")
  File "<stdin>", line 1
    a = (len "abc")
             ^
SyntaxError: invalid syntax
>>>

I think that strikes a reasonable balance between usability and reduced detection of common errors.

I could also dial it back a bit, e.g. maybe it's too much to allow 'C().foo x' and we should only allow dotted names (sufficient to access functions in imported modules and method calls on variables). Or maybe we should only allow simple names (allowing 'len x' but disallowing 'sys.getrefcount x'. Or maybe we should really only bring back print statements.

I believe there are some other languages that support a similar grammar (Ruby? R? Raku?) but I haven't investigated.

Thoughts?

I think its really interesting to see how flexible the new parser can be. Regardless of any actual merits, this is a really cool demonstration of that.

However, I have a few immediate negatives to draw from this as an actual proposal.

First, ambiguity is a factor that Python has always done a really great job of avoiding for the sake of its users. I think this kind of implied call syntax is absolutely the kind of ambiguity that makes a language hard to debug, hard to read, and hard to learn.

Second, I don't think we should discount a certain marketing aspect to a change like this. Like it or not, Python 3's changes were contentious for a lot of users. It took way longer than some of us thought to drag the community into the modern incarnation of the language, and there isn't only a small portion of the community that might still be a little bitter about it. Or, who still have to deal with the split between 2 and 3 even today, EOL be damned.

What message do we send if we undo one of the most visible changes now? We'd send a message that it was all a mistake, and because of the visibility of such a quintessential line of Python

print "Hello, World!"

It wouldn't just send a message that this one change was a mistake, but that the whole ordeal had always been a mistake.

That isn't a can of worms I want to open or ammunition I want to give to naysayers.

--
--Guido van Rossum (python.org/~guido)
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-leave@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/NCQX6ZIBREUTLS52VVG3DSZ43OEXJFTT/
Code of Conduct: http://python.org/psf/codeofconduct/


--

CALVIN SPEALMAN

SENIOR QUALITY ENGINEER

cspealma@redhat.com  M: +1.336.210.5107

https://red.ht/sig