Cross-language name resolutions.
To solve the scope of following codes,
function f(x) # enter f, enter x, x is local
    y = 1 + x # enter y, require x
    g -> begin
      y = 2 # enter g, g is local
      y + g # require y, require g
    end
endwe can use NameResolution.jl to achieve this,
check test/runtests.jl
for more details.
ana = top_analyzer()
enter!(ana, :f)
is_local!(ana, :x)
enter!(ana, :x)
enter!(ana, :y)
require!(ana, :x)
lambda = child_analyzer!(ana)
is_local!(lambda, :g)
enter!(lambda, :g)
enter!(lambda, :y)
require!(lambda, :y)
require!(lambda, :g)
run_analyzer(ana)
println("f ", ana.solved)
println("lambda ", lambda.solved)outputs:
julia> println("f ", ana.solved.x)
f Scope(
  bounds={
    f=>LocalVar(f, is_mutable=false, is_shared=false),
    y=>LocalVar(y, is_mutable=true, is_shared=true),
    x=>LocalVar(x, is_mutable=false, is_shared=false),
  },
  freevars={},
  parent=nothing,
)
julia> println("lambda ", lambda.solved.x)
lambda Scope(
  bounds={
    g=>LocalVar(g, is_mutable=false, is_shared=false),
  },
  freevars={
    y=>LocalVar(y, is_mutable=true, is_shared=true),
  },
  parent=Scope(
    bounds={
      f=>LocalVar(f, is_mutable=false, is_shared=false),
      y=>LocalVar(y, is_mutable=true, is_shared=true),
      x=>LocalVar(x, is_mutable=false, is_shared=false),
    },
    freevars={},
    parent=nothing,
  ),
)