[Cython] Non-type template parameters

Stefan Behnel stefan_ml at behnel.de
Wed Sep 30 09:51:26 CEST 2015


Ian Henriksen schrieb am 29.07.2015 um 23:56:
> On Tue, Jul 28, 2015 at 12:37 PM Robert Bradshaw wrote:
>> On Tue, Jul 28, 2015 at 11:18 AM, Ian Henriksen wrote:
>>> On Tue, Jul 28, 2015 at 1:36 AM Robert Bradshaw wrote:
>>>> On Mon, Jul 20, 2015 at 2:06 PM, Ian Henriksen wrote:
>>>>> 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.
> 
> Yep, I can see why that syntax makes sense. I'm a little worried I may not
> be able
> to finish adding all of this in the near future. Adding all the of this type
> checking for templates goes a long way toward implementing the full syntax
> for declaring them. That said, it seems sensible to catch errors early if
> possible.

I'd like to see this feature merged rather sooner than later. Would it help
if we only require a type to be there (so that people get the syntax right
in their code) but do not validate it for now?

Stefan



More information about the cython-devel mailing list