On Thu, Oct 3, 2013 at 10:21 AM, Nathaniel Smith <n...@pobox.com> wrote:
> On Thu, Oct 3, 2013 at 5:03 PM, Robert Bradshaw <rober...@gmail.com> wrote:
>> On Thu, Oct 3, 2013 at 7:13 AM, Nathaniel Smith <n...@pobox.com> wrote:
>>> On Thu, Oct 3, 2013 at 3:00 PM, Stefan Behnel <stefan...@behnel.de> wrote:
>>>> Nathaniel Smith, 03.10.2013 14:35:
>>>>> On Thu, Oct 3, 2013 at 1:23 PM, Stefan Behnel wrote:
>>>>>> Greg Ewing, 03.10.2013 14:10:
>>>>>>> Robert Bradshaw wrote:
>>>>>>>>     cdef int *a, b, c, *d[3]
>>>>>>>>
>>>>>>>> is IMHO quite ugly but also adds a lot of complexity to the parser.
>>>>>>>> What if instead we required
>>>>>>>>
>>>>>>>>     cdef int* a
>>>>>>>>     cdef int b, c
>>>>>>>>     cdef int[3]* d
>>>>>>
>>>>>> The last line looks ambiguous, BTW, hadn't even noticed it before. Is 
>>>>>> that
>>>>>> an array of int pointers or a pointer to an array (pointer)? We should 
>>>>>> make
>>>>>> sure the way this is declared is really obvious and not unexpected to C 
>>>>>> users.
>>>>> [...]
>>>>> The two halves of this email seem to sort of contradict each other,
>>>>> don't you think? At least the C syntax has the advantage that it's
>>>>> well-defined and many people *do* know it (and if they don't then
>>>>> there are bazillions of references around, plus you can just copy it
>>>>> out of header files if you're wrapping a C library), whereas as noted
>>>>> above, in fact there are *no* people who know how to look at int[3]*
>>>>> and be confident about what it means, even you...?
>>>>
>>>> Well, it's still better than looking at "*d[3]", now, isn't it? Maybe I'm
>>>> just confused (by both, actually) because I'm not really breathing C.
>>>
>>> Yeah, personally in either case I'd have to look it up (and it's
>>> simply impossible that you're going to make it as easy to lookup this
>>> funky Cython-specific syntax as it is to look up standard C syntax).
>>> But also, the reason I don't know the C version already is that I've
>>> probably never seen such a declaration in real life, which makes it
>>> hard to see why this is a really pressing problem.
>>
>> Cause or effect :).
>>
>>> I don't really come
>>> to Cython because I want idiosyncratic tweaks to things C already does
>>> perfectly well, you know?
>>
>> I wouldn't classify this as something that "C already does perfectly
>> well." The fact that people commonly write
>>
>>     int* ptr;
>>
>> rather than
>>
>>     int *ptr;
>>
>> means that it's parsed differently in people's heads than the grammar,
>> and though it's hard to miss given the context of this thread I've
>> seen people gloss right over things like
>>
>>     char* a, b;
>>     a = malloc(n);
>>     b = malloc(n);
>>     strcpy(b, a);
>>
>> which, yes, is perfectly valid C (though any sane compiler will throw
>> out a warning). It should also be noted that an increasing percentage
>> of Cython users don't know C at all.
>
> So, like I said upthread, if this is the problem you're really trying
> to solve, just tackle it directly by making 'char *a, b' an error of
> some kind.
>
>> The rule would be very simple--type decorations would be left
>> associative, so an int*[5]** would be a pointer to a pointer to an
>> array of pointers to ints.
>
> That's a simple rule, but not necessarily a memorable one -- it's
> exactly the opposite of how both English and C work. English: you'd
> say "array of pointers" but write pointer-array *[]. C: *const * is a
> const-pointer-to-pointer, but here it would be a
> pointer-to-const-pointer.

Actually, this is like English. "Int pointer" or "int array pointer"
where the preceding words describe the kind of pointer you have. (it
can be inverted of course, key board = board of keys, stack pointer =
pointer to the stack, etc.) Const is a pain, but I'd say it binds
tighter than anything else and cannot be mixed with the other
declarators to follow C conventions. E.g. "const int*" points to a
const int, and "const (int*)" points to an int but can't be changed.

> In real life of course I'd parenthesize an expression like this to
> make it unambiguous even for readers who don't remember the
> precedence/associativity rules, but I guess in this notation you can't
> parenthesize things, readers will have to memorize/look-up the
> associativity regardless.

Yes, write (((int*)[5])*)* will be supported, just as one can write
(((a - b) - c) - c) instead of a - b - c - d.

>> Now, you're right that this doesn't come up
>> often, which is why it'll be easy to change, but it does complicate
>> the compiler (and hypothetical grammar). Ideally people shouldn't be
>> copying C headers in the long run, they should be parsed automatically
>> or by wrappers like xdress.
>
> But we don't live in the long run. Maybe that will happen eventually,
> maybe it won't -- it's hard to make predictions, especially about the
> future...

Maybe this'll be additional motivation :). But as has been mentioned
they don't come up often in real life, but do have an oversized
presence in the compiler/grammar. Whatever script is provided to clean
up existing .pxd files could be used to transform copy-pasted header
declarations.

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

Reply via email to