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.

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