On Wednesday, February 18, 2015 04:51:44 PM Tamas Papp wrote:
> BTW, what is this Val{} construct? I noticed it in the nighly builds (eg
> for lufact with no pivoting), but could not find it in the docs.Curious, it doesn't show up in the online help but it's here: http://docs.julialang.org/en/latest/stdlib/base/?highlight=val#Base.Val{c} and more elaborately here: http://docs.julialang.org/en/latest/manual/types/#value-types --Tim > > Tamas > > On Wed, Feb 18 2015, Tim Holy <[email protected]> wrote: > > I'm fairly certain you can solve this with a stagedfunction and > > Val{:fieldname}. Left as an exercise for the reader :-). > > > > --Tim > > > > On Wednesday, February 18, 2015 03:57:49 AM Ariel Keselman wrote: > >> I'm working with arrays of immutables each containing several fields. Now > >> creating new immutables based on old ones has become a real pain: > >> > >> old = myarray[i] > >> myarray[i].foo = myimmutable(old.foo, bar, old.x, old.y, etc.) > >> > >> imagine this for 15 fields...! > >> > >> So I made a macro to ease this, it can be used like this: > >> > >> @set myarray i bar=newbar x=newx > >> > >> and the rest of the parameters remain the same. See code below. > >> > >> The problem is that although I can autogenerate the macro for different > >> types, I cannot use the same function name @set for all types. Each type > >> has to have its own special macro! > >> > >> The reason is that this macro requires knowledge of the types it is > >> working > >> on, something missing at macro "runtime". While stagedfunctions do have > >> type information, they miss the array symbol name. > >> > >> Maybe a "stagedmacro" could help ;) > >> > >> Do you know how could this be solved? > >> > >> Thanks! > >> > >> immutable IM > >> > >> aa::Float64 > >> bb::Float64 > >> cc::Float64 > >> dd::Float64 > >> ee::Float64 > >> ff::Float64 > >> gg::Float64 > >> hh::Float64 > >> ii::Float64 > >> jj::Float64 > >> kk::Float64 > >> ll::Float64 > >> > >> end > >> > >> macro set(ARR, IX, KV...) > >> > >> d = [p.args[1]=>p.args[2] for p in KV] > >> aa = get(d,:aa,:($ARR[$IX].aa)) > >> bb = get(d,:bb,:($ARR[$IX].bb)) > >> cc = get(d,:cc,:($ARR[$IX].cc)) > >> dd = get(d,:dd,:($ARR[$IX].dd)) > >> ee = get(d,:ee,:($ARR[$IX].ee)) > >> ff = get(d,:ff,:($ARR[$IX].ff)) > >> gg = get(d,:gg,:($ARR[$IX].gg)) > >> hh = get(d,:hh,:($ARR[$IX].hh)) > >> ii = get(d,:ii,:($ARR[$IX].ii)) > >> jj = get(d,:jj,:($ARR[$IX].jj)) > >> kk = get(d,:kk,:($ARR[$IX].kk)) > >> ll = get(d,:ll,:($ARR[$IX].ll)) > >> quote > >> > >> @inbounds $ARR[$IX] = > >> > >> IM($aa,$bb,$cc,$dd,$ee,$ff,$gg,$hh,$ii,$jj,$kk,$ll) > >> > >> end > >> > >> end > >> > >> this is used as follows: > >> > >> a = [IM(1,1,1,1,1,1,1,1,1,1,1,1), > >> > >> IM(1,1,1,1,1,1,1,1,1,1,1,1), > >> IM(1,1,1,1,1,1,1,1,1,1,1,1), > >> IM(1,1,1,1,1,1,1,1,1,1,1,1), > >> IM(1,1,1,1,1,1,1,1,1,1,1,1)] > >> > >> @set a 1 aa=9 ll=9 > >> > >> # a is now: > >> # [ > >> > >> # IM(1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) > >> # IM(9.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,9.0) > >> # IM(1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) > >> # IM(1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) > >> # IM(1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0)]
