Great! This is effectively like an EQL specializer in CLOS, isn't it?
(Only a bit neater conceptually.)

On Wed, Feb 18 2015, Tim Holy <[email protected]> wrote:

> 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)]

Reply via email to