Re: [Cython] Supporting cython.operator in C

2016-06-01 Thread Jeroen Demeyer

On 2016-05-31 20:35, Robert Bradshaw wrote:

I can't think of any fundamental reason these couldn't be implemented
in C, but there's really no need to do so as they can't be overridden
in C.


Well, for the comma operator there might be no reason. However, it would 
be nice if one could generate arbitrary code of the form


(x) (operator) (y)

for any C/C++ values x and y and any operator. Two particular cases I 
encountered where this would be useful:


1. "x = y" where x is something that Cython does not consider an lvalue.

2. "x || y" because Cython's "x or y" generates complicated code which 
isn't optimized as well as "x || y".



Jeroen.
___
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel


Re: [Cython] Supporting cython.operator in C

2016-06-01 Thread Robert Bradshaw
On Wed, Jun 1, 2016 at 1:56 PM, Jeroen Demeyer  wrote:
> On 2016-05-31 20:35, Robert Bradshaw wrote:
>>
>> I can't think of any fundamental reason these couldn't be implemented
>> in C, but there's really no need to do so as they can't be overridden
>> in C.
>
>
> Well, for the comma operator there might be no reason. However, it would be
> nice if one could generate arbitrary code of the form
>
> (x) (operator) (y)
>
> for any C/C++ values x and y and any operator. Two particular cases I
> encountered where this would be useful:
>
> 1. "x = y" where x is something that Cython does not consider an lvalue.

Cython doesn't support operator= even for C++, nor provide an
operator.X definition for it. (These are only provided for operators
that don't have a Python equivalent.) Are there cases in C where one
has an lvalue but Cython can't tell? (I suppose foo(x) if foo is a
macro--is that the only case?)

You can always define your own macro #define ASSIGN(a, b) (a = b).
Redefining what a valid lvalue is in the language (and syntax) is a
whole can of worms I'd rather avoid getting into...

> 2. "x || y" because Cython's "x or y" generates complicated code which isn't
> optimized as well as "x || y".

I just tried using gcc -O3 and the resulting assembly is identical.
Granted, "x or y" does have a different meaning in Python (and
Cython), returning the first of x or y that is True rather than a
boolean. To get the C behavior, write (x or y). I think this is
automatically done when it's used as a condition. The "more
complicated" code is necessary to get the correct short-circuiting
behavior, in particular when the right hand side is not expressible as
a pure C expression (e.g. requires intermediates).

- Robert
___
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel