ブロックパラメータでないローカル変数はすべて
同じレベルのローカル変数にするというのでは駄目?

$v = 0
def local
 $v += 1
 yield $v
end

foo = 1
local{|x|
 p foo # 1
 p x # 1

 local{|x|
  p foo # 1
  p x # 2
  foo += 1

  local{|x|
   p foo # 2
   p x # 3
  }

  p x # 2
 }

 p x # 1
bar = 3
}
p x # nil
p bar # 3
p foo # 2