Hi Steve,

I have a function in VideoIO.jl which does this:
https://github.com/kmsquire/VideoIO.jl/blob/master/src/util.jl#L6-L14

When wrapping libav/ffmpeg libraries, some of the structs have dozens of
fields, yet I found that needed to declare them as immutable for C
compatibility. At the same time, I needed to modify a few values
occasionally.

I have used it without consequences yet, but I don't know that there aren't
any.  I would reason that modifying a field of an immutable is equivalent
to overwriting the whole thing with mostly the same values, but I'm pretty
sure the compiler doesn't recognize that.

Cheers,
   Kevin

On Sun, Feb 8, 2015 at 12:35 PM, <[email protected]> wrote:

> I would like to request the following language feature: a function or
> macro to modify a field of an immutable inside a container.  Consider:
>
> immutable T
>   fielda::Int
>   fieldb::Int
>   fieldc::Int
> end
>
> function modify_fieldc!(x::Array{T,1}, sub::Int, newc::Int)
>    x[sub] = T(x[sub].fielda, x[sub].fieldb, newc)
> end
>
> This function modifies one field of an immutable object that sits inside a
> container.  The above construct, namely:
>    x[sub] = T(x[sub].field1, x[sub].field2, ... , newval, ...
> x[sub].fieldn)
> occurs rather frequently in my code.  It is not very readable and is also
> fragile in the case that I modify my code and put more fields in T later.
> It would be much nicer if there were a universal function like this:
>    modifyField!(x, sub, fieldc, newc)
>
> Note that I declared T to be 'immutable' rather than 'type' for
> performance reasons-- I prefer the data in the array x to be packed in
> memory rather than accessed with pointers.  If T were a 'type' then
> obviously the problem would go away.
>
> Maybe it is already possible to write a function or macro for this purpose
> in the existing language?
>
> Thanks,
> Steve Vavasis
>
>

Reply via email to