For @nref there is actually the function _nref which makes the
expression, so no need to use macroexpand.  I would suspect that is the
preferred way.

On Sat, 2015-05-23 at 00:33, Peter Brady <[email protected]> wrote:
> I've noticed that a common pattern in my code is to use macroexpand inside 
> functions/macros to generate expressions which are then further manipulated 
> into what I need.  As an example, here's a short function I wrote to unroll 
> a finite difference stencil at a wall (which is then spliced into a larger 
> function to compute the requested derivatives)
>
> julia> function unroll_left(st, idx, N=3)
>            pd = quote end
>            for j=1:size(st,2)
>                ex = Expr(:call, :+)
>                for i=1:size(st,1)
>                    solref = macroexpand(:(@nref $N sol 
> d->(d==$idx?$i:i_{d})))
>                    push!(ex.args, :($solref*$(st[i,j])))
>                end
>                derref = macroexpand(:(@nref $N der d->(d==$idx?$j:i_{d})))
>                push!(pd.args, :($derref = $ex))
>            end
>            pd
>        end
>
> julia> a = rand(4,2)
> 4x2 Array{Float64,2}:
>  0.0352328  0.342554 
>  0.898077   0.489546 
>  0.933981   0.558188 
>  0.721357   0.0678564
>
> julia> unroll_left(a, 1)
> quote 
>     der[1,i_2,i_3] = sol[1,i_2,i_3] * 0.035232761679327096 + sol[2,i_2,i_3] 
> * 0.8980770465285655 + sol[3,i_2,i_3] * 0.9339813198913125 + sol[4,i_2,i_3] 
> * 0.7213570230346098
>     der[2,i_2,i_3] = sol[1,i_2,i_3] * 0.34255367557827077 + sol[2,i_2,i_3] 
> * 0.4895461571970048 + sol[3,i_2,i_3] * 0.5581879223691961 + sol[4,i_2,i_3] 
> * 0.06785635982311189
> end
>
> julia> unroll_left(a, 2)
> quote 
>     der[i_1,1,i_3] = sol[i_1,1,i_3] * 0.035232761679327096 + sol[i_1,2,i_3] 
> * 0.8980770465285655 + sol[i_1,3,i_3] * 0.9339813198913125 + sol[i_1,4,i_3] 
> * 0.7213570230346098
>     der[i_1,2,i_3] = sol[i_1,1,i_3] * 0.34255367557827077 + sol[i_1,2,i_3] 
> * 0.4895461571970048 + sol[i_1,3,i_3] * 0.5581879223691961 + sol[i_1,4,i_3] 
> * 0.06785635982311189
> end
>
>
> This works perfectly but using macroexpand in this way feels a bit hackish. 
>  Is there a better way?

Reply via email to