hslua-core

Bindings to Lua, an embeddable scripting language

https://hslua.org/

Version on this page:2.0.0
LTS Haskell 22.14:2.3.2
Stackage Nightly 2024-03-28:2.3.2
Latest on Hackage:2.3.2

See all snapshots hslua-core appears in

MIT licensed by Albert Krewinkel, Gracjan Polak, Ömer Sinan Ağacan
Maintained by [email protected]
This version can be pinned in stack with:hslua-core-2.0.0@sha256:997d8bd06d406e18943472504a6207dff838383958eb2428e8c644150b055923,4059

hslua-core

Build status AppVeyor Status Hackage

Basic building blocks to interface Haskell and Lua in a Haskell-idiomatic style.

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 the basic building blocks for coders to embed Lua into their programs.

This package is part of HsLua, a Haskell framework built around the embeddable scripting language Lua.

Interacting with Lua

HsLua core 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 HsLua.Core.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.getglobal "print"            -- push print function
      Lua.pushstring "Hello, World!"   -- push string argument
      Lua.call
        (NumArgs 1)    -- number of arguments passed to the function
        (NumResults 0) -- number of results expected
                       -- as return values

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 off the stack, and pushes the results.

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

This package provides all basic building blocks to interact with the Lua stack. If you’d like more comfort, please consider using the hslua-packaging and hslua-classes packages.

Error handling

Errors and exceptions must always be caught and converted when passing language boundaries. The exception type which can be handled is encoded as the type e in the monad LuaE e. Only exceptions of this type may be thrown; throwing different exceptions across language boundaries will lead to a program crash.

Exceptions must support certain operations as defined by the LuaError typeclass. The class ensures that errors can be converted from and to Lua values, and that a new exception can be created from a String message.

Changes

Changelog

hslua-core uses PVP Versioning.

hslua-core 2.0.0

Release pending.

  • Error handling has been reworked completely. The type of exceptions used and handled by HsLua is now exposed to the type system. The type Lua makes use of a default error type. Custom error handling can be implemented by using the LuaE type with an exception type that is an instance of class LuaError.

  • Added new module HsLua.Core.Userdata. It contains thin wrappers around the functions available for creating Haskell-value-wrapping userdata objects.

  • Added new module HsLua.Core.Closures, containing functions to expose Haskell functions to Lua.

  • Reverted to using the auxlib luaL_loadfile function to load a Lua file. Previously files were opened and read in Haskell, but some functionality of the auxlib function was missing.

hslua-core 1.0.0

Released 2021-02-27.

Extracted from hslua-1.3.0.