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