This is Lua 5.1. It won’t work in 5.2 because they’re taking out
`getfenv` and `setfenv`. I don’t know whether that’s a bad thing, but
I’m pretty sure this particular use of that feature isn’t important
enough to count as an argument one way or the other.
To use it as it is:
: kra...@inexorable:~/devel/inexorable-misc ; lua
Lua 5.1.3 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> dofile('dependencies.lua')
> demo()
calling is_consonant with @; dependencies:
string
calling is_consonant with x; dependencies:
vowels
string
calling is_consonant with a; dependencies:
vowels
string
>
Here's the code for `dependencies.lua`, which is also available on
<http://canonical.org/~kragen/sw/inexorable-misc/> and by
`git clone http://canonical.org/~kragen/sw/inexorable-misc.git`.
#!/usr/bin/lua
-- List the dependencies of a function, i.e. the values it uses from
-- outside its own scope. Not sure if this works for upvalues.
-- by Kragen Javier Sitaker, written 2009, dedicated to the public domain
-- (i.e. I abandon all copyright in the work
-- so that anyone may use it for any purpose)
function dependency_grabbing_metatable(target)
local metatable = {}
local dependencies = {}
function metatable.__index(_, key)
dependencies[key] = true
return target[key]
end
function metatable.__newindex(_, key, value)
dependencies[key] = true
target[key] = value
end
return metatable, dependencies
end
function read_logging_proxy(target)
local proxy = {}
local metatable, dependencies = dependency_grabbing_metatable(target)
setmetatable(proxy, metatable)
return proxy, dependencies
end
-- Return a table of the global variables accessed by calling a function.
function get_dependencies(func, ...)
local orig_env = getfenv(func)
new_env, dependencies = read_logging_proxy(orig_env)
setfenv(func, new_env)
func(...)
setfenv(func, orig_env)
return dependencies
end
-- for demo:
vowels = { a=true, e=true, i=true, o=true, u=true }
function is_consonant(char)
char = string.lower(char)
if char < 'a' or char > 'z' then return false end
return not vowels[char]
end
function demo()
for _, char in ipairs {'@', 'x', 'a'} do
print('calling is_consonant with '..char..'; dependencies: ')
for var in pairs(get_dependencies(is_consonant, char)) do
print('', var)
end
end
end
--
To unsubscribe: http://lists.canonical.org/mailman/listinfo/kragen-hacks