On 04/29/2011 12:53 PM, mark florisson wrote:
On 29 April 2011 12:28, Pauli Virtanen<p...@iki.fi>  wrote:
Fri, 29 Apr 2011 11:30:19 +0200, mark florisson wrote:
On 29 April 2011 11:03, Pauli Virtanen<p...@iki.fi>  wrote:
[clip]
Are you planning to special-case the "real_t complex" syntax? Shooting
from the sidelines, one more generic solution might be, e.g.,

I'm sorry, I'm not sure what syntax you are referring to. Are you
talking about actual complex numbers?

This:

On 28 April 2011 23:30, Robert Bradshaw<rober...@math.washington.edu>
wrote:
OK, I take back what I said, I was looking at the RHS, not the LHS. If
one needs to specialize in this manner, explicitly creating two
branches should typically be enough. The same for casting. The one
exception (perhaps) is "my_fused_type complex." Otherwise it's
starting to feel too much like C++ template magic and complexity for
little additional benefit.

That is, declaring a complex type matching a real one.

Ah, I see what you mean now.

        ctypedef cython.fused_type(A, B) struct_t
        ctypedef cython.fused_type(float, double, paired=struct_t) real_t
        ctypedef cython.fused_type(int_t, string_t, paired=struct_t) var_t

and just restrict the specialization to cases that make sense.

The paired means you're declaring types of attributes?

No, just that real_t is specialized to float whenever struct_t is specialized
to A and to double when B. Or a more realistic example,

        ctypedef cython.fused_type(float, double) real_t
        ctypedef cython.fused_type(float complex, double complex) complex_t

        cdef real_plus_one(complex_t a):
            real_t b = a.real
            return b + 1

which I suppose would not be a very unusual thing in numerical codes.

Did you mean

ctypedef cython.fused_type(float complex, double complex,
                           paired=real_t) complex_t

?

This would also allow writing the case you had earlier as

        cdef cython.fused_type(string_t, int, paired=struct_t) attr_t

        cdef func(struct_t mystruct, int i):
            cdef attr_t var

            if typeof(mystruct) is typeof(int):
                var = mystruct.attrib + i
                ...
            else:
                var = mystruct.attrib + i
                ...

Things would need to be done explicitly instead of implicitly, though,
but it would remove the need for any special handling of
the "complex" keyword.

I see, so it's like a mapping. So, I didn't realize that you can't do this:

def func(arbitrary_type complex x):
     ...


We could support this, but I don't think it is powerful enough. I see some code that require pairings like this:

ctypedef cython.fused_type(float, double, float complex, \
 double complex) complex_or_float_t

ctypedef cython.fused_type(float, double, float, \
 double) only_float_t


cdef func(complex_or_float_t x):
    cdef only_float_t y
    ...

So IIUC, one could here add "paired=complex_or_float_t" to say that only_float_t links positionally to corresponding types in complex_or_float_t.

Perhaps "pair_up_with="? "given_by="?

Anyway, I'm wondering if the special case of complex could be handled by having magical built-in fused types for the floating point for these purposes, and that these would suffice *shrug*.

Dag Sverre
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to