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.