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

Reply via email to