hslua: Bindings to Lua, an embeddable scripting language

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain]

HsLua provides bindings, wrappers, types, and helper functions to bridge Haskell and Lua.

This package contains a full Lua interpreter version 5.3.5. If you want to link it with a system-wide Lua installation, use the system-lua flag.

Example programs are available in a separate repository.


[Skip to ReadMe]

Properties

Versions0.1, 0.2, 0.3, 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6, 0.3.6.1, 0.3.7, 0.3.8, 0.3.9, 0.3.10, 0.3.11, 0.3.12, 0.3.13, 0.4.0, 0.4.1, 0.5.0, 0.6.0, 0.7.0, 0.7.1, 0.8.0, 0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.9.5.1, 0.9.5.2, 1.0.0, 1.0.0, 1.0.1
Change logCHANGELOG.md
Dependenciesbase (>=4.8 && <5), bytestring (>=0.10.2 && <0.11), containers (==0.5.*), exceptions (>=0.8 && <0.11), fail (>=4.9 && <5), mtl (==2.2.*), text (>=1.0 && <1.3) [details]
LicenseMIT
Copyright© 2007–2012 Gracjan Polak © 2012–2016 Ömer Sinan Ağacan © 2016–2018 Albert Krewinkel
AuthorGracjan Polak, Ömer Sinan Ağacan
Maintaineralbert+hslua@zeitkraut.de
CategoryForeign
Home pagehttps://hslua.github.io/
Bug trackerhttps://github.com/hslua/hslua/issues
Source repositoryhead: git clone https://github.com/hslua/hslua.git
UploadedMon Sep 24 06:06:43 UTC 2018 by tarleb

Modules

[Index]

Flags

NameDescriptionDefaultType
system-lua

Use the system-wide Lua instead of the bundled copy.

DisabledManual
apicheck

Compile Lua with -DLUA_USE_APICHECK.

DisabledManual
lua_32bits

Compile Lua with -DLUA_32BITS

DisabledManual
allow-unsafe-gc

Allow optimizations which make Lua's garbage collection potentially unsafe; haskell finalizers must be handled with extreme care.

EnabledManual
export-dynamic

Add all symbols to dynamic symbol table; disabling this will make it possible to create fully static binaries, but renders loading of dynamic C libraries impossible.

EnabledManual
pkg-config

Use pkg-config to discover library and include paths. Setting this flag implies system-lua.

DisabledManual

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainers' corner

For package maintainers and hackage trustees


Readme for hslua-1.0.0

[back to package description]

HsLua – Bindings to Lua, an embeddable scripting language

Build Status AppVeyor Status Hackage

HsLua provides bindings, wrappers, types, and helper functions to bridge Haskell and Lua.

Overview

Lua is a small, well-designed, embeddable scripting language. It has become the de-facto default to make programs extensible and is widely used everywhere from servers over games and desktop applications up to security software and embedded devices. This package provides Haskell bindings to Lua, enable coders to embed the language into their programs, making them scriptable.

HsLua ships with batteries included and includes the most recent Lua version (i.e., Lua 5.3.5). Cabal flags make it easy to compile against a system-wide Lua installation.

Interacting with Lua

HsLua provides the Lua type to define Lua operations. The operations are executed by calling run. A simple "Hello, World" program, using the Lua print function, is given below:

import Foreign.Lua as Lua

main :: IO ()
main = Lua.run prog
  where
    prog :: Lua ()
    prog = do
      Lua.openlibs  -- load Lua libraries so we can use 'print'
      Lua.callFunc "print" "Hello, World!"

The Lua stack

Lua's API is stack-centered: most operations involve pushing values to the stack or receiving items from the stack. E.g., calling a function is performed by pushing the function onto the stack, followed by the function arguments in the order they should be passed to the function. The API function call then invokes the function with given numbers of arguments, pops the function and parameters of the stack, and pushes the results.

,----------.
|  arg 3   |
+----------+
|  arg 2   |
+----------+
|  arg 1   |
+----------+                  ,----------.
| function |    call 3 1      | result 1 |
+----------+   ===========>   +----------+
|          |                  |          |
|  stack   |                  |  stack   |
|          |                  |          |

Manually pushing and pulling arguments can become tiresome, so HsLua makes function calling simple by providing callFunc. It uses type-magic to allow different numbers of arguments. Think about it as having the signature

callFunc :: String -> a1 -> a2 -> … -> res

where the arguments a1, a2, … must be of a type which can be pushed to the Lua stack, and the result-type res must be constructable from a value on the Lua stack.

Getting values from and to the Lua stack

Conversion between Haskell and Lua values is governed by two type classes:

-- | A value that can be read from the Lua stack.
class Peekable a where
  -- | Check if at index @n@ there is a convertible Lua value and
  --   if so return it.  Throws a @'LuaException'@ otherwise.
  peek :: StackIndex -> Lua a

and

-- | A value that can be pushed to the Lua stack.
class Pushable a where
  -- | Pushes a value onto Lua stack, casting it into meaningfully
  --   nearest Lua type.
  push :: a -> Lua ()

Many basic data types (except for numeric types, see the FAQ) have instances for these type classes. New instances can be defined for custom types using the functions in Foreign.Lua.Core (also exported in Foreign.Lua).

Build flags

The following cabal build flags are supported:

Example: using a different lua version

To use a system-wide installed Lua when linking hslua as a dependency, build/install your package using --constraint="hslua +system-lua". For example, you can install Pandoc with hslua that uses system-wide Lua like this:

cabal install pandoc --constraint="hslua +system-lua"

or with stack:

stack install pandoc --flag=hslua:system-lua

Q&A