BlitzMax/Modules/Other/Lua 核心
"Lua 是一种扩展编程语言,旨在支持具有数据描述功能的一般过程式编程。它还提供对面向对象编程、函数式编程和数据驱动编程的良好支持。Lua 旨在用作任何需要它的程序的强大、轻量级脚本语言。"(摘自 Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes 的“Lua 5.1 参考手册”)
此模块为 Lua 主 API 和辅助 API 提供了一个 BlitzMax 接口。它几乎完整,唯一缺少的函数是那些具有可变参数列表的函数(BlitzMax 目前尚不支持)。
axe.lua 包还包含完整的 Lua 5.1.4 发行版。Lua 源代码已完全集成到模块中,不再需要额外的 DLL(或共享库)。
Lua 参考手册是此发行版的一部分,可以从此处直接访问
可以在 Lua 网站 上找到更多信息;Lua wiki 包含更多材料 关于此模块 和相关包的信息。
以下描述并非教程,但仍然可以帮助您在 BlitzMax 中开始 Lua 编程。更多与 API 相关的资料可以在 Lua 参考手册 中找到。
运行 Lua 脚本总是需要至少实例化一个 Lua VM。
local LuaState:byte ptr = luaL_newstate()
该实例化的结果是指向一个结构体的指针,该结构体包含了新 VM 的完整状态,必须作为第一个参数传递给几乎所有其他 Lua API 函数。
现在是时候“打开”内建的 Lua 库了(注意:这些库现在是 axe.lua 的一部分,不需要外部 DLL 或共享库)。
luaL_openlibs(LuaState)
始终通过打开其库来初始化 Lua VM,除非你真的知道自己在做什么!
通常情况下,创建单个 Lua 状态就足够了,甚至进一步的(Lua)线程共享基本的 Lua 状态(及其关联的环境)。
最后,始终关闭 Lua VM 是一个好主意。
lua_close(LuaState)
Lua 解释器现在已经终止,其状态变量不再有效。
代码
lua_pushstring(LuaState, "BMXString")
lua_setglobal (LuaState, "luaglobal")
定义一个全局 Lua 变量(称为 luaglobal),它包含一个字符串(即“BMXString”)。
为了从 Lua 脚本中访问 BlitzMax 功能,有必要实现合适的 BlitzMax 函数并在 Lua VM 中注册它们。
此类 BlitzMax 函数通常如下所示
function BMXName:int (LuaState:Byte Ptr)
... ' handling of parameters passed from Lua (if required)
... ' actual function body
... ' passing results back to Lua (if required)
return 0 ' number of values returned to Lua
end function
然后使用以下方法注册此类函数
lua_register(LuaState, "luaname", BMXName)
此命令在 Lua 中将 BlitzMax 函数(称为 BMXName)注册为(全局)名称 luaname。这两个名称可以相同,但不必相同。
代码
local Result:int = luaL_loadString(LuaState,LuaScript)
if (Result <> 0) then
' ERROR!!!
lua_close(LuaState) ' just to be complete
end
end if
加载并编译包含 Lua 脚本的(BlitzMax)字符串。编译结果将保留在(Lua)堆栈上。
lua_getfield(LuaState, LUA_GLOBALSINDEX, "debug")' get global "debug"
lua_getfield(LuaState, -1, "traceback") ' get "debug.traceback"
lua_remove (LuaState, -2) ' remove "debug" table from stack
Result = lua_pcall(LuaState,1,-1,-1)' use "debug.traceback" as err.hdlr
if (Result <> 0) then
' ERROR
lua_close(LuaState) ' just to be complete
end
end if
实际上评估先前加载的脚本。前面提到的 Lua 命令只是为 Lua 脚本失败时的正确错误消息做准备。
函数 lua_atpanic:Byte Ptr (lua_state:Byte Ptr, panicf:Int(ls:Byte Ptr)
描述:参见 Lua 参考手册
函数 lua_call (lua_state:Byte Ptr, nargs:Int, nresults:Int)
描述:参见 Lua 参考手册
函数 lua_checkstack:Int (lua_state:Byte Ptr, extra:Int)
描述:参见 Lua 参考手册
函数 lua_close (lua_state:Byte Ptr)
描述:参见 Lua 参考手册
函数 lua_concat (lua_state:Byte Ptr, n:Int)
描述:参见 Lua 参考手册
函数 lua_cpcall:Int (lua_state:Byte Ptr, func:Int(ls:Byte Ptr)
描述:参见 Lua 参考手册
函数 lua_createtable (lua_state:Byte Ptr, narr:Int, nrec:Int)
描述:参见 Lua 参考手册
函数 lua_dump:Int (lua_state:Byte Ptr, writer:Int(ls:Byte Ptr,p:Byte Ptr,sz:Int,ud:Byte Ptr)
描述:参见 Lua 参考手册
函数 lua_equal:Int (lua_state:Byte Ptr, index1:Int, index2:Int)
描述:参见 Lua 参考手册
函数 lua_error:Int (lua_state:Byte Ptr)
描述:参见 Lua 参考手册
函数 lua_gc:Int (lua_state:Byte Ptr, what:Int, data:Int)
描述:参见 Lua 参考手册
函数 lua_getallocf:Byte Ptr (lua_state:Byte Ptr, ud:Byte Ptr Ptr)
描述:参见 Lua 参考手册
函数 lua_getfenv (lua_state:Byte Ptr, index:Int)
描述:参见 Lua 参考手册
函数 lua_getfield (lua_state:Byte Ptr, index:Int, k$z)
描述: 请参考 Lua 参考手册
函数 lua_gethook:Byte Ptr (lua_state:Byte Ptr)
描述: 请参考 Lua 参考手册
函数 lua_gethookcount:Int (lua_state:Byte Ptr)
描述: 请参考 Lua 参考手册
函数 lua_gethookmask:Int (lua_state:Byte Ptr)
描述: 请参考 Lua 参考手册
函数 lua_getinfo:Int (lua_state:Byte Ptr, what$z, ar:lua_Debug Ptr)
描述: 请参考 Lua 参考手册
函数 lua_getlocal$z (lua_state:Byte Ptr, ar:lua_Debug Ptr, n:Int)
描述: 请参考 Lua 参考手册
函数 lua_getmetatable:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_getstack:Int (lua_state:Byte Ptr, level:Int, ar:lua_Debug Ptr)
描述: 请参考 Lua 参考手册
函数 lua_gettable (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_gettop:Int (lua_state:Byte Ptr)
描述: 请参考 Lua 参考手册
函数 lua_getupvalue$z (lua_state:Byte Ptr, funcindex:Int, n:Int)
描述: 请参考 Lua 参考手册
函数 lua_insert (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_iscfunction:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_isnumber:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_isstring:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_isuserdata:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_lessthan:Int (lua_state:Byte Ptr, index1:Int, index2:Int)
描述: 请参考 Lua 参考手册
函数 lua_load:Int (lua_state:Byte Ptr, reader:Byte Ptr(ls:Byte Ptr,data:Byte Ptr,sz:Int Ptr)
描述: 请参考 Lua 参考手册
函数 lua_newstate:Byte Ptr (f:Byte Ptr(ud:Byte Ptr, p:Byte Ptr, osize:Int, nsize:Int)
描述: 请参考 Lua 参考手册
函数 lua_newthread:Byte Ptr (lua_state:Byte Ptr)
描述: 请参考 Lua 参考手册
函数 lua_newuserdata:Byte Ptr (lua_state:Byte Ptr, size:Int)
描述: 请参考 Lua 参考手册
函数 lua_next:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_objlen:Int (lua_state:Byte Ptr, index:Int)
描述: 请参考 Lua 参考手册
函数 lua_pcall:Int (lua_state:Byte Ptr, nargs:Int, nresults:Int, errfunc:Int)
描述: 请参考 Lua 参考手册
函数 lua_pushboolean (lua_state:Byte Ptr, b:Int)
描述: 请参见 Lua 参考手册
函数 lua_pushcclosure (lua_state:Byte Ptr, fn:Int(ls:Byte Ptr)
描述: 请参见 Lua 参考手册
函数 lua_pushinteger (lua_state:Byte Ptr, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_pushlightuserdata (lua_state:Byte Ptr, p:Byte Ptr)
描述: 请参见 Lua 参考手册
函数 lua_pushlstring (lua_state:Byte Ptr, s:Byte Ptr, size:Int)
描述: 请参见 Lua 参考手册
函数 lua_pushnil (lua_state:Byte Ptr)
描述: 请参见 Lua 参考手册
函数 lua_pushnumber (lua_state:Byte Ptr, n:Double)
描述: 请参见 Lua 参考手册
函数 lua_pushstring (lua_state:Byte Ptr, s$z)
描述: 请参见 Lua 参考手册
函数 lua_pushthread:Int (lua_state:Byte Ptr)
描述: 请参见 Lua 参考手册
函数 lua_pushvalue (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_rawequal:Int (lua_state:Byte Ptr, index1:Int, index2:Int)
描述: 请参见 Lua 参考手册
函数 lua_rawget (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_rawgeti (lua_state:Byte Ptr, index:Int, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_rawset (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_rawseti (lua_state:Byte Ptr, index:Int, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_remove (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_replace (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_resume:Int (lua_state:Byte Ptr, narg:Int)
描述: 请参见 Lua 参考手册
函数 lua_setallocf (lua_state:Byte Ptr, f:Byte Ptr(ud:Byte Ptr, p:Byte Ptr, osize:Int, nsize:Int)
描述: 请参见 Lua 参考手册
函数 lua_setfenv:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_setfield (lua_state:Byte Ptr, index:Int, k$z)
描述: 请参见 Lua 参考手册
函数 lua_sethook:Int (lua_state:Byte Ptr, f(ls:Byte Ptr,ar:lua_Debug Ptr)
描述: 请参见 Lua 参考手册
函数 lua_setlocal$z (lua_state:Byte Ptr, ar:lua_Debug Ptr, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_setmetatable:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_settable (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_settop (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_setupvalue$z (lua_state:Byte Ptr, funcindex:Int, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_status:Int (lua_state:Byte Ptr)
描述: 请参见 Lua 参考手册
函数 lua_toboolean:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_tocfunction:Byte Ptr (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_tointeger:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_tolstring:Byte Ptr (lua_state:Byte Ptr, index:Int, size:Int Ptr)
描述: 请参见 Lua 参考手册
函数 lua_tonumber:Double (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_topointer:Byte Ptr (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_tothread:Byte Ptr (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_touserdata:Byte Ptr (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_type:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_typename$z (lua_state:Byte Ptr, tp:Int)
描述: 请参见 Lua 参考手册
函数 lua_xmove (fromState:Byte Ptr, toState:Byte Ptr, n:Int)
描述: 请参见 Lua 参考手册
函数 lua_yield:Int (lua_state:Byte Ptr, nresults:Int)
描述: 请参见 Lua 参考手册
函数 lua_getglobal (lua_state:Byte Ptr, name:String)
描述: 请参见 Lua 参考手册
函数 lua_isboolean:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_isfunction:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_islightuserdata:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_isnil:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_isnone:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_isnoneornil:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_istable:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_isthread:Int (lua_state:Byte Ptr, index:Int)
描述: 请参见 Lua 参考手册
函数 lua_newtable (lua_state:Byte Ptr)
描述: 参见 Lua 参考手册
函数 lua_pop (lua_state:Byte Ptr, n:Int)
描述: 参见 Lua 参考手册
函数 lua_pushcfunction (lua_state:Byte Ptr, fn:Int(ls:Byte Ptr)
描述: 参见 Lua 参考手册
函数 lua_register (lua_state:Byte Ptr, name:String, f:Int(ls:Byte Ptr)
描述: 参见 Lua 参考手册
函数 lua_setglobal (lua_state:Byte Ptr, name:String)
描述: 参见 Lua 参考手册
函数 lua_tostring:String (lua_state:Byte Ptr, index:Int)
描述: 参见 Lua 参考手册
函数 luaL_addlstring (B:Byte Ptr, s:Byte Ptr, l:Int)
描述: 参见 Lua 参考手册
函数 luaL_addsize (B:Byte Ptr, size:Int)
描述: 参见 Lua 参考手册
函数 luaL_addstring (B:Byte Ptr, s$z)
描述: 参见 Lua 参考手册
函数 luaL_addvalue (B:Byte Ptr)
描述: 参见 Lua 参考手册
函数 luaL_argerror:Int (lua_state:Byte Ptr, narg:Int, extramsg$z)
描述: 参见 Lua 参考手册
函数 luaL_buffinit (lua_state:Byte Ptr, B:Byte Ptr)
描述: 参见 Lua 参考手册
函数 luaL_callmeta:Int (lua_state:Byte Ptr, obj:Int, e$z)
描述: 参见 Lua 参考手册
函数 luaL_checkany (lua_state:Byte Ptr, narg:Int)
描述: 参见 Lua 参考手册
函数 luaL_checkinteger:Int (lua_state:Byte Ptr, narg:Int)
描述: 参见 Lua 参考手册
函数 luaL_checklstring:Byte Ptr (lua_state:Byte Ptr, narg:Int, size:Int Ptr)
描述: 参见 Lua 参考手册
函数 luaL_checknumber:Double (lua_state:Byte Ptr, narg:Int)
描述: 参见 Lua 参考手册
函数 luaL_checkstack (lua_state:Byte Ptr, sz:Int, msg$z)
描述: 参见 Lua 参考手册
函数 luaL_checktype (lua_state:Byte Ptr, narg:Int, t:Int)
描述: 参见 Lua 参考手册
函数 luaL_checkudata:Byte Ptr (lua_state:Byte Ptr, narg:Int, tname$z)
描述: 参见 Lua 参考手册
函数 luaL_getmetafield:Int (lua_state:Byte Ptr, obj:Int, e$z)
描述: 参见 Lua 参考手册
函数 luaL_gsub$z (lua_state:Byte Ptr, s$z, p$z, r$z)
描述: 参见 Lua 参考手册
函数 luaL_loadbuffer:Int (lua_state:Byte Ptr, buff:Byte Ptr, sz:Int, name$z)
描述: 参见 Lua 参考手册
函数 luaL_loadfile:Int (lua_state:Byte Ptr, filename$z)
描述: 请参阅 Lua 参考手册
函数 luaL_loadstring:Int (lua_state:Byte Ptr, s$z)
描述: 请参阅 Lua 参考手册
函数 luaL_newmetatable:Int (lua_state:Byte Ptr, tname$z)
描述: 请参阅 Lua 参考手册
函数 luaL_newstate:Byte Ptr ()
描述: 请参阅 Lua 参考手册
函数 luaL_openlibs (lua_state:Byte Ptr)
描述: 请参阅 Lua 参考手册
函数 luaL_optinteger:Int (lua_state:Byte Ptr, narg:Int, d:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_optlstring:Byte Ptr (lua_state:Byte Ptr, narg:Int, d$z, size:Int Ptr)
描述: 请参阅 Lua 参考手册
函数 luaL_optnumber:Double (lua_state:Byte Ptr, narg:Int, d:Double)
描述: 请参阅 Lua 参考手册
函数 luaL_prepbuffer:Byte Ptr (B:Byte Ptr)
描述: 请参阅 Lua 参考手册
函数 luaL_pushresult (B:Byte Ptr)
描述: 请参阅 Lua 参考手册
函数 luaL_ref:Int (lua_state:Byte Ptr, t:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_register (lua_state:Byte Ptr, libname$z, l:lua_Reg Ptr)
描述: 请参阅 Lua 参考手册
函数 luaL_typerror:Int (lua_state:Byte Ptr, narg:Int, tname$z)
描述: 请参阅 Lua 参考手册
函数 luaL_unref (lua_state:Byte Ptr, t:Int, ref:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_where (lua_state:Byte Ptr, lvl:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_addchar (B:Byte Ptr, c:String)
描述: 请参阅 Lua 参考手册
函数 luaL_argcheck (lua_state:Byte Ptr, cond:Int, narg:Int, extramsg:String)
描述: 请参阅 Lua 参考手册
函数 luaL_checkint:Int (lua_state:Byte Ptr, narg:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_checklong:Long (lua_state:Byte Ptr, narg:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_checkstring:String (lua_state:Byte Ptr, narg:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_dofile:Int (lua_state:Byte Ptr, filename:String)
描述: 请参阅 Lua 参考手册
函数 luaL_dostring:Int (lua_state:Byte Ptr, str:String)
描述: 请参阅 Lua 参考手册
函数 luaL_getmetatable (lua_state:Byte Ptr, tname:String)
描述: 请参阅 Lua 参考手册
函数 luaL_optint:Int (lua_state:Byte Ptr, narg:Int, d:Int)
描述: 请参阅 Lua 参考手册
函数 luaL_optlong:Long (lua_state:Byte Ptr, narg:Int, d:Long)
描述: 请参阅 Lua 参考手册
函数 luaL_optstring:String (lua_state:Byte Ptr, narg:Int, d:String)
描述: 请参阅 Lua 参考手册
函数 luaL_typename:String (lua_state:Byte Ptr, idx:Int)
描述: 请参阅 Lua 参考手册