[Cython] Non-type template parameters

Robert Bradshaw robertwb at gmail.com
Tue Jul 28 20:36:36 CEST 2015


On Tue, Jul 28, 2015 at 11:18 AM, Ian Henriksen
<insertinterestingnamehere at gmail.com> wrote:
>
> On Tue, Jul 28, 2015 at 1:36 AM Robert Bradshaw <robertwb at gmail.com> wrote:
>>
>> Sorry for not getting back sooner... responses below.
>>
>> On Mon, Jul 20, 2015 at 2:06 PM, Ian Henriksen
>> <insertinterestingnamehere at gmail.com> wrote:
>> > Hi all,
>> > I've spent a little time working on adding support for non-type
>> > template parameters. In doing this, it has been very easy to add
>> > support for doing something like the following:
>> >
>> > cdef extern from "add_const.hpp" nogil:
>> >     int myfunc1[i](int)
>> > def test():
>> >     print myfunc1[2](a)
>> >
>> > The downside of this is that it does not let the Cython compiler
>> > distinguish between different kinds of template parameters.
>> >
>> > Stricter checking could be added using a syntax like this:
>> >
>> > cdef extern from "add_const.hpp" nogil:
>> >     int myfunc1[int i](int)
>> > def test():
>> >     print myfunc1[2](a)
>> >
>> > The downsides here are that the syntax doesn't really match the
>> > existing template syntax. It will also complicate the Cython codebase
>> > since we'll have to go to greater lengths to allow or disallow all the
>> > different special cases for templates.
>> >
>> > Which version would be preferable?
>>
>> I think I'd prefer the [int i] syntax. Hopefully it shouldn't
>> complicate things too much.
>
> Okay, I think I see a way to make that work. On the other hand, since there
> weren't any replies here, I've already nearly finished implementing the
> first
> syntax. I'll spend another hour or two finishing it off later today and
> submit a PR
> so you can look it over. I originally favored the first syntax because it
> minimizes
> the number of fancy template features (SFINAE, for example) we have to worry
> about on the Cython end. I'm still open to discuss it though.

I think this falls into the "explicit is better than implicit" bucket.
That and getting obscure template errors that could have been caught
at Cython compile time will be very nice.

>> > On a similar note, for variadic templates, would we prefer something
>> > like
>> >
>> > cdef extern from "my_variadic.hpp" nogil:
>> >     T myfunc2[T,...](T, ...)
>> >
>> > or something like:
>> >
>> > cdef extern from "my_variadic.hpp" nogil:
>> >     T myfunc2[T, Types...](T, Types... args)
>> >
>> > Again, the latter syntax is more explicit, but it will require much more
>> > complicated code in Cython. It also doesn't match the existing syntax
>> > very well. The former syntax matches the existing syntax for templates
>> > better, but will make it hard for Cython to raise errors early on in
>> > compilation.
>>
>> Hmm... this is a tougher call. Let's go with the former for now.
>
>
> I like the former a lot more. It will keep the syntax simpler on our end and
> I
> haven't been able to find any case that it doesn't cover. This will also be
> significantly easier to implement. I'll take a look at it soon.

Sounds good.

There's also the question of default arguments. Let's adopt the [type
T = *] syntax for that.

>> > I'd greatly appreciate any input on the best syntax for either use-case.
>> >
>> > Regards,
>> >
>> > -Ian Henriksen
>> >
>> > _______________________________________________
>> > cython-devel mailing list
>> > cython-devel at python.org
>> > https://mail.python.org/mailman/listinfo/cython-devel
>> >
>> _______________________________________________
>> cython-devel mailing list
>> cython-devel at python.org
>> https://mail.python.org/mailman/listinfo/cython-devel
>
>
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> https://mail.python.org/mailman/listinfo/cython-devel
>


More information about the cython-devel mailing list