Awesome, it works now:

const pnames = [:p1, :p2, :d1, :d2, :K1, :K2, :d3, :d4, :s1, :s2, :g1, :g2]

macro unpack(ex)
  Expr(:block, [:($(pnames[i]) = $ex[$i]) for i = 1:length(pnames) ]...) |> 
esc
end

macro pack(ex)
    N = length(pnames)
    Expr(:block, [
:($ex = zeros($N,1)),
 [:( $ex[$i] = $(pnames[i]) ) for i = 1:length(pnames) ]
]...) |> esc
end

I can use it like that:

    dt = 1e-3
    p1 = 24.0
    p2 = 20.0

    d1 = 1.0
    d2 = 0.5

    K1 = 2.00
    K2 = -1.0

    d3= 4.
    d4= 4.
    s1=0.1
    s2=0.2

    g1=0.5
    g2=0.5

    Nt = 10^5

    @pack p

    th, phi, idx_th, idx_phi = doSimulation1(Nt,dt,p)

and then in doSimulation1: 

function doSimulation1(Nt::Int,dt::Float64,p)

    @unpack p

    w1 = dt*2*pi/p1
    w2 = dt*2*pi/p2

    ...

It works only for scalars, and it's not really useful for functions that 
get called a lot because it allocates memory, but it's still pretty neat.


Reply via email to