Bindings for Other Languages

sol2/sol3 (header-only, modern, fast), LuaBridge, LuaBridge3, Kaguya, luabind (old)

mlua (Lua 5.1–5.4, LuaJIT, Luau; async support), rlua (deprecated in favor of mlua) lupa (embed Lua/LuaJIT in Python)

gopher-lua (pure Go VM), golua (cgo bindings) Fengari, Wasmoon (WebAssembly)

LuaJ (pure Java), LuaJava, luaj on Android NLua, MoonSharp node-lua, wasmoon

// sol2 example (C++17)
#include <sol/sol.hpp>
struct Player { std::string name; int hp = 100; void heal(int v) { hp += v; } };
int main() {
    sol::state lua;
    lua.open_libraries(sol::lib::base);
    lua.new_usertype<Player>("Player", sol::constructors<Player()>(),
        "name", &Player::name, "hp", &Player::hp, "heal", &Player::heal);
    lua.script(R"(
        local p = Player.new()
        p.name = "Hero"
        p:heal(25)
        print(p.name, p.hp)
    )");
    int sum = lua.script("return 2 + 3");
}
// mlua example
use mlua::{Lua, Result};
fn main() -> Result<()> {
    let lua = Lua::new();
    let add = lua.create_function(|_, (a, b): (i64, i64)| Ok(a + b))?;
    lua.globals().set("add", add)?;
    let v: i64 = lua.load("return add(2, 3) * 10").eval()?;
    println!("{v}");
    Ok(())
}