以下の行を含む「test.lua」というファイル名があるとします。
--[[ test.lua --]]
local f = function()
print"local function f in test.lua"
end
f_generate = function()
local fun = loadstring(" f()")
-- local env = getfenv(1)
-- set(fun,env)
return fun
end
f_generate()()
--[[ end of test.lua--]]
loadstring はグローバル環境で処理を行っているため、f_generate()() を呼び出すと、「グローバル 'f' (nil 値) を呼び出そうとしています」というエラーが表示されます。
コメントアウトされたコードは、関数環境がこの問題に対処できないことを示しています。
原因テーブルは lua の唯一のデータ構造です (そして、関数環境と他の多くのものはテーブルによって実装されます)、クロージャーもテーブルによって実装されると仮定するのは合理的だと思いますが、どうすれば取得できますか?