Dag Sverre Seljebotn wrote:
> Stefan Behnel wrote:
>> Dag Sverre Seljebotn, 25.01.2010 10:17:
>>  
>>> Stefan Behnel wrote:
>>>    
>>>>> [...] why not just represent a borrowed reference as a pointer?
>>>>> So you could write
>>>>>
>>>>>      cdef list some_list = []
>>>>>      cdef list* borrowed_ref = some_list
>>>>>
>>>>> and borrowed_ref would be a non-refcounted pointer to a Python 
>>>>> list. Assignments back to a normal reference would be allowed:
>>>>>
>>>>>      cdef list my_list = borrowed_ref   # increfs the pointer
>>>>>
>>>>> After all, a non-refcounted reference to a Python object is not 
>>>>> more than a bare pointer to a well-defined Python 
>>>>> builtin/extension type (including "object*").
>>>>>         
>>> Well, there's the drawback of making the language more complicated, 
>>> and also I think the notation is confusing -- plain "object" is not 
>>> by value, and "object*" is not a pointer to an "object", so to speak.
>>>     
>>
>> I was trying to let the syntax emphasise that it *is* a pointer, not a
>> reference. A reference is special in Cython in that it handles 
>> ref-counting
>> for it. A pointer just behaves like any other pointer in the language.
>>
>> I agree that it's not flawless, but I think it makes sense and is 
>> unambiguous.
>>   
> Let me put it this way: To me, "object*" somehow indicates PyObject**, 
> since "object" is PyObject*. I find it confusing that "object" and 
> "object*" are at the same "indirection level", so to speak.
>
> Also, would
>
> cdef object* x = ...
> print x[0]
>
> do a getitem on x, or returned a reference-counted copy of x? Not easy 
> to guess from the syntax alone.
>
> Assuming a getitem (as that's a useful operation and the other is 
> already served by <object>x), one is then inconsistent with everywhere 
> else the *-notation is used.
>
> I'd be fine with almost any kind of syntax which is a superset of the 
> current syntax -- "cdef nonmanaged object x", you name it. The problem 
> with "object*" is that it is not immediately obvious to a reader with 
> a brief knowledge of Cython that it is fundamentally different from 
> "int*".

Another example: Reading the docs up front, just reading someone elses 
code, I'd expect this to work:

cdef object x
cdef object* px
px = &x
px[0] = "hello"
print x # should print "hello"


Dag Sverre
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to