View Source Lua (Lua v0.0.1)

Lua is an ergonomic interface to Luerl, aiming to be the best way to use Luerl from Elixir.

Features

  • Ergonomic API for Elixir <> Lua FFI
  • Improved error messages
  • Deep-setting variables and state
  • Excellent documentation and guides for working with Luerl

Executing Lua

Lua can be run using the eval!/2 function

    iex> {[4], _} =
    ...>   Lua.eval!("""
    ...>   return 2 + 2
    ...>   """)

Exposing Elixir functions to Lua

Lua provides the deflua macro for exposing Elixir functions to Lua

defmodule MyAPI do
  use Lua.API
      
  deflua double(v), do: 2 * v
end
    
lua = Lua.new() |> Lua.load_api(MyAPI)

{[10], _} =
  Lua.eval!(lua, """
  return double(5)
  """)

Credits

Lua piggy-backs off of Robert Virding's Luerl project, which implements an Lua lexer, parser, and full-blown lua virtual machine that runs inside the BEAM.

Summary

Functions

Evalutes the script or chunk, returning the result and discarding side effects in the state

Gets a table value in Lua

Inject functions written with the deflua macro into the Lua runtime

Initializes a Lua VM sandbox. All library functions are stubbed out, so no access to the filesystem or the execution environment is exposed.

Sandboxes the given path, swapping out the implementation with a function that raises when called

Sets a table value in Lua. Nested keys will create intermediate tables

Sets the path patterns that Lua will look in when requiring Lua scripts.

Functions

Link to this function

eval!(state \\ new(), script)

View Source

Evalutes the script or chunk, returning the result and discarding side effects in the state

Gets a table value in Lua

iex> state = Lua.set!(Lua.new(), [:hello], "world")
iex> Lua.get!(state, [:hello])
"world"

When a value doesn't exist, it returns nil

iex> Lua.get!(Lua.new(), [:nope])
nil

It can also get nested values

iex> state = Lua.set!(Lua.new(), [:a, :b, :c], "nested")
iex> Lua.get!(state, [:a, :b, :c])
"nested"
Link to this function

load_api(lua, module, scope \\ nil)

View Source

Inject functions written with the deflua macro into the Lua runtime

Link to this function

load_lua_file!(lua, path)

View Source

Initializes a Lua VM sandbox. All library functions are stubbed out, so no access to the filesystem or the execution environment is exposed.

Options

  • :sandboxed - list of paths to be sandboxed, e.g. sandboxed: [[:require], [:os, :exit]]

Sandboxes the given path, swapping out the implementation with a function that raises when called

iex> lua = Lua.new(sandboxed: [])
iex> Lua.sandbox(lua, [:os, :exit])

Sets a table value in Lua. Nested keys will create intermediate tables

iex> Lua.set!(Lua.new(), [:hello], "World")

It can also set nested values

iex> Lua.set!(Lua.new(), [:a, :b, :c], [])

These table values are availble in lua scripts

iex> lua = Lua.set!(Lua.new(), [:a, :b, :c], "nested!")
iex> {result, _} = Lua.eval!(lua, "return a.b.c")
iex> result
["nested!"]
Link to this function

set_lua_paths(lua, paths)

View Source

Sets the path patterns that Lua will look in when requiring Lua scripts.