I have a number of variables based on composite types. I want the fields of these variables synced to disk, so that every time I modify a field, the data is written to disk. Is there any way to do this with assignment notation?
For example, type Foo x::Int32 y::Int16 z::Int16 function Foo(x,y,z) s = stream("foo",true, true, true, false, false) write(s, x) write(s, y) write(s, z) end end f=Foo(1,2,3) ... f.z = 4 The constructor will write the initial values to disk. What kind of code can I add to this program so that the assignment of f.z seeks to the disk location where z is stored and writes the new value. I don't mind implementing a function like function update(value, name::Symbol, x) T = type(value) index = indexin([:x], convert(Array{Symbol,1},names(T))) seek(s, fieldoffsets(T)[index]) write(s, x) setfield(value, name, x) end but I don't want to have to call update(f, :z, 4) everywhere in the code that wants to change f. I want to write f.z=4. Otherwise, the user of my type may forget and cause inconsistency between data in memory and data on disk. I know that some languages have triggers, where a function can be called when a variable is modified, and I know that I can write functions to replace operators in Julia. But I cannot find any such trigger functionality in Julia, nor can I seem to override the assignment operator (=). function =(x, v) ... end doesn't work; it tells me "syntax: unexpected =". The docs state that there is a setfield! function that is called for a.b = c, but the language disagrees. Apparently it's actually named setfield (no exclamation point). And it's not a function I can replace. setfield(x, name::Symbol, value) = println("$name") reports "invalid method definition: not a generic function". So, setfield cannot be overridden. Do I have any options? Thanks, Keith