This use case is nicely covered by short form for keyword arguments. So in this 
case instead of plot(x, z), we'd have plot(=x, =z) which would be transformed 
into plot(**{'x': x, 'z': z}) at compile time. This could work for any 
expression:

foo(=lamda x: x*2) -> foo(**{'lamda x: x*2': lamda x: x*2})

This feature is easy to implement and has broad applications. 

> On 13 Jul 2019, at 21:16, Nima Hamidi <ham...@stanford.edu> wrote:
> 
> Hello all,
> 
> I would like to briefly share my thoughts on non-standard evaluation (NSE), 
> why this is useful, and how, potentially, it can be added to Python. In most 
> languages, functions have access only to the value of their arguments, and 
> not to the expressions that yielded those values. However, sometimes it is 
> useful to have access to the expressions as well. For example, let plot(x, y, 
> ...) be a function that draws the scatter plot of y against x and adds labels 
> for the x- and y-axes. Currently, there is no way to distinguish plot(x, z, 
> ...) from plot(x, y, ...) from within the function. As such, one needs to 
> pass the names of the variables to the plot function to be used as the axes' 
> labels. Using NSE, though, the function can look at the expressions in the 
> method call and use those as the default value for labels. In R, this idea is 
> used widely to make the syntax simpler.
> 
> In the following, I sketch how I think this can be implemented:
> Let BoundExpression be a class containing an ast.Expression as well as locals 
> and globals dictionaries. BoundExpression can also have an eval method that 
> evaluates its expression using its locals and globals dictionaries.
> Let `x` be the short form for BoundExpression("x", locals(), globals()). 
> Then, the plot function can be implemented in a way that plot(`x`, `y`) draws 
> scatter plot of x and y and also, labels the axes correctly. No need to 
> provide labels explicitly anymore.
>  A more challenging idea is to let developers decide whether their functions 
> need NSE or not. For example, when a function is defined as def f(`x`), for 
> any method call like f(x), the first argument should be wrapped with a 
> BoundExpression instance.
> I would appreciate any feedback on these ideas.
> 
> Best,
> Nima
> 
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@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/QE5OTQSEQHBBWWAQVIA66YUKGK5M6QDL/
> Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@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/JMT2VY6GMJTPWU4V2SII2C4Y6EUVEJSQ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to