Awesome
Luar: Lua reflection bindings for Go
Luar is designed to make using Lua from Go more convenient. Go structs, slices and maps can be automatically converted to Lua tables and vice-versa. The resulting conversion can either be a copy or a proxy. In the latter case, any change made to the result will reflect on the source.
Any Go function can be made available to Lua scripts, without having to write C-style wrappers.
Luar support cyclic structures (map[string]interface{}
, lists, etc.).
User-defined types can be made available to Lua as well: their exported methods can be called and usual operations such as indexing or arithmetic can be performed.
See the documentation for usage instructions and examples.
Installation
Install with
go get <repo>/luar
Luar uses Alessandro Arzilli's golua. See golua's homepage for further installation details.
REPL
Version 1.x features an example REPL that is available in the cmd
folder.
Changelog
Luar 2
This is a rewrite of 1.x with extended features and a cleaner API. The main differences with the previous version:
-
The function prototypes of
GoToLua
andLuaToGo
are simpler and do not require the use of reflection from the callers. Thedontproxify
argument is gone, useGoToLuaProxy
to control proxification. -
The
Copy*
functions andGoLuaFunc
are gone, useGoToLua
andLuaToGo
instead. -
Use
Register
instead ofRawRegister
. -
InitProxies
is gone since it was not needed. -
The
LuaObject
andLuaTableIter
structure fields are unexported. -
LuaObject methods not only work on Lua functions but also on anything with a
__call
metamethods. Idem for tables and the__index
/__newindex
metamethods. -
Use
NewLuaObjectFromName(L, "_G")
instead ofGlobal
. -
Lookup
andGeti
gone. Instead theGet
andGetObject
functions are variadic: each subfield argument can be any valid Lua key (string, integer...). -
Use
(*LuaObject) Call
instead of(*LuaObject) Callf
. The protoype of(*LuaObject) Call
has changed in a fashion similar toGoToLua
andLuaToGo
.Types
is gone as it is no longer needed. -
Register
ProxyIpairs
andProxyPairs
instead of callingLuarSetup
. -
Register and use
Unproxify
instead ofArrayToTable
,MapToTable
,ProxyRaw
,SliceToTable
andStructToTable
. -
ComplexReal
andComplexImag
have been replaced by the proxy attributesreal
andimag
, respectively. -
SliceSub
andSliceAppend
have been replaced by the proxy methodsslice
andappend
, respectively. Slice proxies have thecap
metamethod alongsideappend
andslice
. -
String proxies have a
slice
method just like slice proxies. They can be looped rune-by-rune over withipairs
.
The range of supported conversion has been extended:
-
LuaToGo can convert to interfaces and pointers with several levels of indirection.
-
LuaToGo can convert to non-empty maps and structs.