Web Lua |
|
这是一个在 Web 界面后面运行的 Lua 版本 [1].
点击 **版本** 按钮会告诉你它使用的 Lua 版本。例如,它目前会显示
Lua 4.0 Copyright (C) 1994-2000 TeCGraf, PUC-Rio
尝试在 Lua 代码 区域中输入
print("hello world")
Lua 将源代码编译成中间格式以执行。如果你点击 **luac** 按钮,你会看到
luac generates the follow output: main <0:@/tmp/abcdefg> (4 instructions/16 bytes at 0x12345678) 0 params, 2 stacks, 0 locals, 2 strings, 0 numbers, 0 functions, 3 lines 1 [2] GETGLOBAL 0 ; print 2 [2] PUSHSTRING 1 ; "hello world" 3 [2] CALL 0 0 4 [2] END
你可以在 VM 代码中看到 print("hello world")
代码的元素。不过我们在这里不会详细介绍。
如果我们点击 **lua2c** 按钮,你会看到
lua2c generates the following: static int MAIN(lua_State *L) { lua_getglobal(L,"print"); lua_pushstring(L,"hello world"); lua_call(L,1,0); return 0; }
一个 Lua 脚本(称为 lua2c.lua
)从 luac
的输出中生成了上面的代码。如果你想让 C 和 Lua 相互作用,你可以使用 Lua C API。为了节省时间,你可以在 Lua 代码 窗口中输入你想要做的事情,然后点击 **lua2c** 按钮。这会生成一些代码,你可以将这些代码剪切粘贴到你的 C 代码中。
假设你想读取 foo.x
的值,其中 foo 是一个包含数字 x 的表。我们可以将 value = foo.x
输入到 WebLua 中,lua2c 会给我们
static int MAIN(lua_State *L) { lua_getglobal(L,"foo"); lua_pushstring(L,"x"); lua_gettable(L,-2); lua_remove(L,-2); lua_setglobal(L,"value"); return 0; }
value
,并使用 Lua API 获取数字,例如
lua_getglobal(L,"foo"); lua_pushstring(L,"x"); lua_gettable(L,-2); lua_remove(L,-2); double value = lua_tonumber(L,-1); /* code we added */