|
To be close variable ( https://www.lua.org/manual/5.4/manual.html#3.3.8 ) in form it implemented is harmful by nature.
They introduces unnecessary complexity. This implementation creates more problems than they solve. It will lead to bugs on all levels. Even more this problems will be hard to find and debug.
Let me show small example:
#!lua54
-- https://gist.githubusercontent.com/kov-serg/360d9b7e4a3bb4c67585dfb1068adf6c/raw/cab4ca0d794a31d780d50f6c57138cd5643b569c/lua54_tbv.lua
print(_VERSION)
function test(name)
return setmetatable({},{
__close=function() print("__close "..name) end,
__gc=function() print("__gc "..name) end,
})
end
do -- 1. programmer should know what is variable is to-be-closed or not
-- This is introduction of unnecessary complexity
local v1 = test "v1"
local v2<close> = test "v2"
end
function test2(name1,name2)
return "string",test(name1),test(name2)
end
do -- 2. Is order of variables correct or changed? Programmer should always trace it.
-- You can't specify <close> to normal variable only for table
-- This is useless waste of energy
local a,b<close>,c = test2("v3","v4")
end
function test3(...)
return setmetatable( { test2(...) } , {
__close=function(self)
-- 3. how is intended to do recursive close ?
print("group")
for i=#self,1,-1 do -- again: sunset by hand
local v=self[i]
local mt=getmetatable(v)
if mt and mt.__close then mt.__close(v) end
end
end
})
end
do -- 4. There is no mechanism for recursive to-be-close
-- Again it falls on the shoulders of users
local r<close> = test3("v5","v6")
end
function test4(...) end
do -- 5. If result is not using or passed as arguments we will have leaks
-- This again force to gain useless efforts
test3("v7","v8")
test4( test3("v9","v10") )
end
print "collect garbage"
collectgarbage "collect"
print "done"
--[[output:
Lua 5.4
__close v2
__close v3
group
__close v6
__close v5
__gc v8
__gc v7
__gc v6
__gc v5
__gc v4
__gc v3
__gc v2
__gc v1
collect garbage
__gc v10
__gc v9
done
]]
Variables are not automatically be closed. You have to trace this manually EVERY time. It's like manually coloring for variables. Any if any color doesn't match it will works not as expected. Absolutely pointless activity. It will be worse if code base will grow and number of programmers will increase. Any changes will cause pain every time they be applied.
More over every thing to manage resource lua has before version 5.4. One possible solution for resource management is
https://raw.githubusercontent.com/kov-serg/lua-aux/master/proto-seq_fn.lua
Have any reasonable objections?