|
|
||
|
Graham Wakefield wrote:
_G["print"]("hello to you too") On Dec 12, 2006, at 12:46 AM, Austin Xu Wang wrote:$ lua Lua 5.1.1 Copyright (C) 1994-2006 Lua.org, PUC-Rioarray={print} array[1]("Hello World!")Hello World!
I think the question was not "how to call a function indirectly", but "how to call the n-th function of the, say, iolib array?"
The answer is: you can't. Not in the Lua side, at least.If you want to optimize your code, make the function local - Lua will use a local by it's index, avoiding a table lookup.
Example:
local print = print -- or '_G.print' or 'mypackage.print'
function main()
print("hello wolrd");
end -- "end function" ?
main()
Inspecting the output of luac -l, you will see:
> cat > test.lua
function main()
print("hello world")
end
> luac50 -l test.lua
main <test.lua:0> (3 instructions, 12 bytes at 00325910)
0 params, 2 stacks, 0 upvalues, 0 locals, 1 constant, 1 function
1 [3] CLOSURE 0 0 ; 00325A70
2 [1] SETGLOBAL 0 0 ; main
3 [3] RETURN 0 1 0
function <test.lua:1> (4 instructions, 16 bytes at 00325A70)
0 params, 2 stacks, 0 upvalues, 0 locals, 2 constants, 0 functions
1 [2] GETGLOBAL 0 0 ; print
2 [2] LOADK 1 1 ; "hello world"
3 [2] CALL 0 2 1
4 [3] RETURN 0 1 0
And the version with locals:
> cat > test-local.lua
local print = print
function main()
print("hello world")
end
> luac50 -l test-local.lua
main <test-local.lua:0> (5 instructions, 20 bytes at 00325918)
0 params, 2 stacks, 0 upvalues, 1 local, 2 constants, 1 function
1 [1] GETGLOBAL 0 0 ; print
2 [4] CLOSURE 1 0 ; 00325BA8
3 [4] MOVE 0 0 0
4 [2] SETGLOBAL 1 1 ; main
5 [4] RETURN 0 1 0
function <test-local.lua:2> (4 instructions, 16 bytes at 00325BA8)
0 params, 2 stacks, 1 upvalue, 0 locals, 1 constant, 0 functions
1 [3] GETUPVAL 0 0 0 ; print
2 [3] LOADK 1 0 ; "hello world"
3 [3] CALL 0 2 1
4 [4] RETURN 0 1 0
Note that in the second version, instead of querying the global table
with GETGLOBAL, the function 'main' called GETUPVAL, which retrieve an
upvalue by it's index, which is very fast.
--rb
On 12/12/06, BrillyWu <brillywu@gmail.com> wrote:In lua baselib.c,it give us a lot of base function,such as: static const struct luaL_reg iolib[] = { {LUA_ERRORMESSAGE, errorfb}, {"clock", io_clock}, {"date", io_date}, {"debug", io_debug}, {"execute", io_execute}, {"exit", io_exit}, {"getenv", io_getenv}, {"remove", io_remove}, {"rename", io_rename}, {"setlocale", setloc}, {"tmpname", io_tmpname} }; static const struct luaL_reg iolibtag[] = { {"appendto", io_appendto}, {"closefile", io_close}, {"flush", io_flush}, {"openfile", io_open}, {"read", io_read}, {"readfrom", io_readfrom}, {"seek", io_seek}, {"write", io_write}, {"writeto", io_writeto} }; and in my project,I definded a lot of function of myself.and register to lua. in Lua script,I can use this function: test.lua function main() print("hello wolrd"); end function main(); ----------------------------- I use the function by its funciton name:"print",How can I call printfunction,not by its function name,but use the index of the function in thearray?