>>94
setfenv(0,env)だと現在のスレッドの環境が変わる。
現在実行中の関数の環境を変えるにはsetfenv(1,env)で。

適当にまとめてみた
・グローバル変数の参照・代入…実行中の関数の環境
・getfenv(0)/setfenv(0,env)…スレッドの環境
・getfenv(1)/setfenv(1,env)…実行中の関数の環境
・関数の中で作られた関数は親の環境を受け継ぐ
例:
function f()
 local g = function() end
 return g
end
-- fは実行中のチャンクの環境を受け継ぎ、gはfの環境を受け継ぐ。
・load*系で作った関数はスレッドの環境を受け継ぐ
例:
local t = setmetatable({hoge="t"},{__index=_G})
hoge="main"
print(t,hoge)
setfenv(0,t) -- スレッドの環境が変更される
print(getfenv(1),getfenv(0),hoge) -- 実行中の関数はそのまま
loadstring[[
print(getfenv(1),getfenv(0),hoge)
]]()