Lua In Free Pascal

lua-users home
wiki

[Free Pascal] is a well-supported Pascal compiler available on many platforms.

All routines from the C API and auxiliary library mentioned in the Lua 5.1 reference manual are supported in the lua, lualib or lauxlib libraries of Free Pascal 2.4. For Lua 5.2 and later, see the sections below. There is no documentation, but you can use the Lua manual since the call sequences are basically identical, with only a few exceptions.

In order to split strings over multiple lines in Free Pascal, create multiple string constants that are concatenated via the '+' operator. Alternatively, you can store your Lua code in files, or put it all on one line.

Type names

luaL_Reg    => lua_CFunction
Most others are obvious, with P used for pointer, e.g.
luaState*   => Plua_State
or standard, e.g.
void*       => Pointer
int         => Integer
You can always look at the interface of lauxlib.pas etc (package fpc-source on Ubuntu) to make sure.

Routine names

Some names starting with lua_L are different (probably typos):

luaL_dofile         => lua_dofile
luaL_dostring       => lua_dostring
luaL_getmetatable   => lua_Lgetmetatable

Minimal usage example

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.

Lua 5.2 update

1. Download [the Pascal source] of the unit and save it under the name lua52.pas.
2. Change the line defining LUA_LIB_NAME to that of your system's Lua 5.2 shared library. Some possible names are lua52.dll (Windows), liblua5.2.so (Debian, Ubuntu etc) and liblua.so.5.2 (Red Hat, Fedora etc).

This update conforming to Lua 5.2 was made by Egor Skriptunoff. Some further improvements, including Delphi compatibility, were added by Vladimir Klimov. See the comments at the start of lua52.pas for full details. The version here was uploaded on 1 May 2013. A more recent version (1 March 2014) with mainly cosmetic changes is available but attempts to upload it have so far failed.

Note that PChar and String in Free Pascal have been implemented as Unicode since December 2009. To retain Lua compatibility, the types PAnsiChar and AnsiString are now used.

Only one unit lua52 is needed, not three units. A minimal usage example is:

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.

Lua 5.3 update

1. Download [the Pascal source] of the unit and save it under the name lua53.pas.
2. Change the line defining LUA_LIB_NAME to that of your system's Lua 5.3 shared library. Some possible names are lua53.dll (Windows), liblua5.3.so (Debian, Ubuntu etc) and liblua.so.5.3 (Red Hat, Fedora etc). On some systems, there may be several aliases to that file. Try another if the first one does not work.

This update conforming to Lua 5.3 was made for Lazarus by Malcome@Japan https://github.com/malcome/Lua4Lazarus. Some small changes to make it run under Free Pascal 2.6.2 were made by Dirk Laurie. See the comments at the start of lua53.pas for full details.

These changes are not necessary if the dynlibs unit is included. The original version on https://github.com/malcome/Lua4Lazarus was found to work perfectly with Free Pascal 3.0.0 (the current stable version in early 2017).

Only one unit lua53 is needed, not three units. A minimal usage example is:

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.

RecentChanges · preferences
edit · history
Last edited April 24, 2017 5:56 pm GMT (diff)