Emulate local static variable?

Julia has no static keyboard. In C, a static variable inside a function has a value that persists over function calls.

One way to emulate this in Julia is with a global variable. This has two limitations: first, this pollutes the global scope; second, a global variable should be const for performance, since its type cannot be annotated. What if I want a non-const static variable?

Is there a way to emulate a local static variable in Julia?
Local in the sense that it should be visible only inside the scope of the function that uses it.

I’m not quite sure what static mean but I think it is this: A let block and a closure is the usual style. Here an example https://github.com/JuliaLang/julia/blob/a304c557928d9eaa0a28af5fe96327d5da70d14b/base/random.jl#L1397

2 Likes

It’s unclear what the semantic of a static local variable in julia should be. On possible implementation with a certain semantic is

julia> macro static(expr)
           if Meta.isexpr(:(::), expr)
               T = eval(current_module(), expr.args[2])
               name = expr.args[1]
           else
               T = Any
               name = expr
           end
           :($(esc(name)) = $(Ref{T}()))
       end

Can you use this in an example?

@mauro3 Yes, this works. Thanks.

Or just do call overloading. This example has 2 constants which can be used inside the function:

type  LotkaVolterra <: ParameterizedFunction
         a::Float64
         b::Float64
end
f = LotkaVolterra(0.0,0.0)
(p::LotkaVolterra)(t,u,du) = begin
         du[1] = p.a * u[1] - p.b * u[1]*u[2]
         du[2] = -3 * u[2] + u[1]*u[2]
end

The last line makes f a function f(t,u,du), and uses the fields a and b from the type.

Since f is just an instance of a type, you can also change these fields outside of the function if you want. f.a = 1. Or you can only use them in the function, take your pick.

2 Likes