lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


if change "pcall(_ENV[func_name])" to "print(pcall(_ENV[func_name]))", then:

false attempt to call a nil value
false attempt to call a nil value
false attempt to call a nil value

2015-06-08 23:18 GMT+03:00 Milind Gupta <milind.gupta@gmail.com>:
Is there a problem doing it this way: ?

local function func1() print("local func1") end
local function func2() print("local func2") end

local fn = { "func1", "func2" }

for i = 1, 3 do
local func_name = fn[i]
pcall(_ENV[func_name])
end

On Mon, Jun 8, 2015 at 12:49 PM, Brigham Toskin <brighamtoskin@gmail.com> wrote:
If it makes sense, you may be able to cache these as locals and/or upvalues in some cases for a speed bump. You'll have to decide if it fits your project architecture though, i.e. used several times after lookup, rather than completely dynamical at each call site.

On Mon, Jun 8, 2015 at 12:25 PM, Dmitry Zaitsev <hhrhhr@gmail.com> wrote:
Thanks to all. Indeed, the search for local names was rather slow in the case of frequent use, so I will use the table of functions from the first example.

2015-06-08 22:18 GMT+03:00 Brigham Toskin <brighamtoskin@gmail.com>:
Oh, reflection. Yeah, forgot about that. Still, probably a bad idea to do this in a loop or frequently-called code, unless you're sure it won't bottleneck your code.

On Mon, Jun 8, 2015 at 12:13 PM, Paul K <paul@zerobrane.com> wrote:
> it is work, but I'm interested in the ability to call a local function:

You can iterate over local variables to find the one with the name you need:

local function func1() print("local func1") end
local function func2() print("local func2") end

local fn = { "func1", "func2", "func3" }

local function name2value(target)
  for i = 1, math.huge do
    local name, value = debug.getlocal(2, i)
    if not name then return end
    if name == target then return value end
  end
end

for i = 1, 3 do
  local func_name = fn[i]
  pcall(name2value(func_name) or error("can't find local "..func_name))
end

Paul.

On Mon, Jun 8, 2015 at 11:56 AM, Dmitry V. Zaitsev <hhrhhr@gmail.com> wrote:
> example with table of functions:
>
> local T = {}
> function T.func1() print("func1") end
> function T.func2() print("func2") end
>
> local fn = { "func1", "func2", "func3" }
>
> for i = 1, 3 do
> local func_name = fn[i]
> pcall(T[func_name])
> end
>
> it is work, but I'm interested in the ability to call a local function:
>
> local function func1() print("local func1") end
> local function func2() print("local func2") end
>
> local fn = { "func1", "func2", "func3" }
>
> for i = 1, 3 do
> local func_name = fn[i]
> pcall(func_name) -- ???
> end
>
> of course, I get an error "attempt to call a string value".




--
Brigham Toskin




--
Brigham Toskin