Lua In Free Pascal |
|
Free Pascal 2.4 的 lua、lualib 或 lauxlib 库支持 Lua 5.1 参考手册中提到的 C API 和辅助库的所有例程。对于 Lua 5.2 及更高版本,请参阅下面的部分。虽然没有专门的文档,但你可以使用 Lua 手册,因为调用序列基本相同,只有少数例外。
要在 Free Pascal 中将字符串分割到多行,请创建多个字符串常量,并通过 '+' 运算符将它们连接起来。或者,你可以将 Lua 代码存储在文件中,或者将所有代码放在一行上。
luaL_Reg => lua_CFunction大多数其他名称都很直观,P 用于指针,例如:
luaState* => Plua_State或标准,例如:
void* => Pointer int => Integer你可以随时查看
lauxlib.pas 等接口(Ubuntu 上的 fpc-source 包)来确认。
以 lua_L 开头的某些名称有所不同(可能是拼写错误)
luaL_dofile => lua_dofile luaL_dostring => lua_dostring luaL_getmetatable => lua_Lgetmetatable
uses lua, lualib, lauxlib;
var L: Plua_State;
result: integer;
begin
L := lua_open(); luaL_openlibs(L);
result := lua_dostring(L,
'for k in string.gmatch("a,b,c,d,e,f,g,h","([^,]+),") do print(k) end'
);
lua_close(L);
end.
Pascal 源代码]并将其保存为 lua52.pas。LUA_LIB_NAME 的行,使其指向你系统的 Lua 5.2 共享库。一些可能的名称包括 lua52.dll (Windows)、liblua5.2.so (Debian, Ubuntu 等) 和 liblua.so.5.2 (Red Hat, Fedora 等)。此符合 Lua 5.2 的更新由 Egor Skriptunoff 完成。Vladimir Klimov 添加了一些进一步的改进,包括 Delphi 兼容性。请参阅 lua52.pas 开头的注释以获取完整详细信息。此版本于 2013 年 5 月 1 日上传。有一个更新的版本(2014 年 3 月 1 日),主要进行了美化更改,但尝试上传一直失败。
请注意,自 2009 年 12 月以来,Free Pascal 中的 PChar 和 String 已实现为 Unicode。为保持 Lua 兼容性,现已使用 PAnsiChar 和 AnsiString 类型。
只需要一个单元 lua52,而不是三个单元。一个最小的使用示例是:
uses lua52; (* 5.2 change *)
var L: Plua_State;
result: integer;
begin
L := luaL_newstate(); (* 5.2 change *)
luaL_openlibs(L);
result := luaL_dostring(L, 'print (unpack,table.unpack)');
lua_close(L);
end.
Pascal 源代码]并将其保存为 lua53.pas。LUA_LIB_NAME 的行,使其指向你系统的 Lua 5.3 共享库。一些可能的名称包括 lua53.dll (Windows)、liblua5.3.so (Debian, Ubuntu 等) 和 liblua.so.5.3 (Red Hat, Fedora 等)。在某些系统上,可能存在指向该文件的多个别名。如果第一个名称不起作用,请尝试另一个。此符合 Lua 5.3 的更新由 Malcome@Japan 为 Lazarus 完成 https://github.com/malcome/Lua4Lazarus。Dirk Laurie 进行了一些小的更改,使其可以在 Free Pascal 2.6.2 下运行。请参阅 lua53.pas 开头的注释以获取完整详细信息。
如果包含了 dynlibs 单元,则无需进行这些更改。在 https://github.com/malcome/Lua4Lazarus 上找到的原始版本在 Free Pascal 3.0.0(2017 年初的当前稳定版本)下运行良好。
只需要一个单元 lua53,而不是三个单元。一个最小的使用示例是:
uses lua53, dynlibs;
var L: Plua_State;
result: integer;
begin
L := luaL_newstate();
luaL_openlibs(L);
result := luaL_dostring(L,
'print ("`H�l�ne` has "..utf8.len"H�l�ne".." UTF8 characters.")');
lua_close(L);
end.