(offered with the caveat that I cannot answer your question)
It seems to me that duplicating any singleton is incorrect,  and so this is 
appropriately an "issue" with deepcopy.


On Tuesday, February 23, 2016 at 10:10:24 AM UTC-5, Bill Hart wrote:
>
> Just correcting a typo in my question (the question still stands):
>
> deepcopy(A)[1] == x
>
> was not meant to be written twice. I accidentally copy and pasted it from 
> my terminal twice.
>
> On Tuesday, 23 February 2016 15:16:08 UTC+1, Bill Hart wrote:
>>
>> In Nemo.jl we require some objects to be singleton. In other words they 
>> should never be deep copied since we require only one of them to exist.
>>
>> This is causing a problem with deepcopy of arrays that somewhere contain 
>> these objects.
>>
>> E.g. in Nemo.jl:
>>
>> Qx,x = PolynomialRing(QQ, "x") # here x contains one of these "singleton" 
>> objects
>> A = [x]
>> deepcopy(A)[1] == x
>> deepcopy(A)[1] == x
>>
>> ERROR: Incompatible polynomial rings in polynomial operation
>>  [inlined code] from /home/wbhart/.julia/v0.5/Nemo/src/generic/Poly.jl:33
>>  in == at /home/wbhart/.julia/v0.5/Nemo/src/flint/fmpq_poly.jl:281
>>  in eval at ./boot.jl:263
>>
>> The error message is one Nemo itself raises, and it is of course because 
>> deepcopy(A) does a deep copy of everything in the array, including x, and 
>> that causes a deepcopy of the singleton object inside x. 
>>
>> I thought simply overriding the deepcopy method for our singleton objects 
>> would do the trick:
>>
>> Base.deepcopy(R::Nemo.Ring) = R
>>
>> but this doesn't fix the issue. So what is the recommended way to have 
>> this recursive deepcopy of arrays not make a copy of anything of type T <: 
>> Nemo.Ring?
>>
>> It seems I can overload deepcopy_internal, but this seems like an 
>> unsupported hack. Is there something more canonical I should be doing to 
>> handle singleton objects?
>>
>> Bill.
>>
>> P.S: Yes, I realise copy(A) does not have this problem. But I am 
>> specifically asking about the situation where we want to deepcopy an array.
>>
>>

Reply via email to