[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Closures & Recursion
- From: Stefan Brantschen <sbr@...>
- Date: Fri, 28 Jul 2006 14:24:04 +0200
Newbie question: I ran into the question how to use closures with
recursion -- consider this snippet:
local function visited (x)
-- Check and register if a table 'x' has been visited
local vis = {}
return function (x)
for _, v in pairs(vis) do
if x == v then return true
end
v[#v+1] = x
return false
end
function visit (x)
-- Visit potentially recursive and circular structures.
local cv = visited()
if type(x) == "string" then
-- do something
elseif type(x) = ... -- more types to ensure end of recursion
-- do something
elseif type(x) == "table" then
if not cv(x) then
for _, v in pairs(x) do
visit (x)
end
end
end
end
The issue with this code is of course that each recursion call will
create a new closure ('local cv = visited()') and hence all this does
not work as intended.
What is the Correct Way to go with LUA in this case (of course
without creating globals to keep visited table -- if possible)?
Thanks and regards
- Stefan