HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulehslua-core-2.3.2Haskell2010

HsLua.Core

Core Lua API. This module provides thin wrappers around the respective functions of the Lua C API. C functions which can throw an error are wrapped such that the error is converted into an Exception. However, memory allocation errors are not caught and will cause the host program to terminate.

  • 20 types
  • 1 class
  • 147 values

Run Lua computations

7 declarations
valuerun :: LuaE e a -> IO a
#

Run Lua computation using the default HsLua state as starting point. Exceptions are masked, thus avoiding some issues when using multiple threads. All exceptions are passed through; error handling is the responsibility of the caller.

valuerunWith :: State -> LuaE e a -> IO a
#

Run Lua computation with the given Lua state. Exception handling is left to the caller; resulting exceptions are left unhandled.

valuerunEither :: Exception e => LuaE e a -> IO (Either e a)
#

Run the given Lua computation; exceptions raised in Haskell code are caught, but other exceptions (user exceptions raised in Haskell, unchecked type errors, etc.) are passed through.

newtypenewtype GCManagedState
#

Wrapper of a Lua state whose lifetime is managed by the Haskell garbage collector and has a finalizer attached. This means that the state does not have to be closed explicitly, but will be closed automatically when the value is garbage collected in Haskell.

Lua Computations

6 declarations
newtypenewtype LuaE e a
#

A Lua computation. This is the base type used to run Lua programs of any kind. The Lua state is handled automatically, but can be retrieved via state.

Instances10MonadReader, Monad, Functor, MonadFail, Applicative, Alternative, …
typetype Lua a = LuaE Exception a
#

A Lua operation.

This type is suitable for most users. It uses a default exception for error handling. Users who need more control over error handling can use LuaE with a custom error type instead.

valueunsafeRunWith :: State -> LuaE e a -> IO a
#

Run the given operation, but crash if any Haskell exceptions occur.

This function is identical to runWith; it exists for backwards compatibility.

methodliftIO :: IO a -> m a
#

Lift a computation from the IO monad. This allows us to run IO computations in any monadic stack, so long as it supports these kinds of operations (i.e. IO is the base monad for the stack).

Example
import Control.Monad.Trans.State -- from the "transformers" library

printState :: Show s => StateT s IO ()
printState = do
  state <- get
  liftIO $ print state

Had we omitted liftIO, we would have ended up with this error:

• Couldn't match type ‘IO’ with ‘StateT s IO’
 Expected type: StateT s IO ()
   Actual type: IO ()

The important part here is the mismatch between StateT s IO () and IO ().

Luckily, we know of a function that takes an IO a and returns an (m a): liftIO, enabling us to run the program and see the expected results:

> evalStateT printState "hello"
"hello"

> evalStateT printState 3
3

Lua API types

4 declarations

Type for C functions.

In order to communicate properly with Lua, a C function must use the following protocol, which defines the way parameters and results are passed: a C function receives its arguments from Lua in its stack in direct order (the first argument is pushed first). So, when the function starts, Lua.Functions.lua_gettop returns the number of arguments received by the function. The first argument (if any) is at index 1 and its last argument is at index Lua.Functions.lua_gettop. To return values to Lua, a C function just pushes them onto the stack, in direct order (the first result is pushed first), and returns the number of results. Any other value in the stack below the results will be properly discarded by Lua. Like a Lua function, a C function called by Lua can also return many results.

See lua_CFunction.

newtypenewtype Integer
#

The type of integers in Lua.

By default this type is Int64, but that can be changed to different values in Lua. (See LUA_INT_TYPE in luaconf.h.)

See lua_Integer.

Constructors

Instances9Bounded, Enum, Eq, Integral, Num, Ord, …
newtypenewtype Number
#

The type of floats in Lua.

By default this type is Double, but that can be changed in Lua to a single float or a long double. (See LUA_FLOAT_TYPE in luaconf.h.)

See lua_Number.

Constructors

Instances10Eq, Floating, Fractional, Num, Ord, Read, …

Stack index

Number of arguments and return values

Table fields

newtypenewtype Name
#

Name of a function, table field, or chunk; the name must be valid UTF-8 and may not contain any nul characters.

Implementation note: this is a newtype instead of a simple type Name = ByteString alias so we can define a UTF-8 based IsString instance. Non-ASCII users would have a bad time otherwise.

Constructors

Instances5Eq, Ord, Show, IsString, Semigroup
  • Eq NameDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Ord NameDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Show NameDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • IsString NameDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Semigroup NameDefined in hslua-core-2.3.2 · HsLua.Core.Types

Lua API

0 declarations

Constants and pseudo-indices

State manipulation

newtypenewtype State
#

An opaque structure that points to a thread and indirectly (through the thread) to the whole state of a Lua interpreter. The Lua library is fully reentrant: it has no global variables. All information about a state is accessible through this structure.

Synonym for lua_State *. See lua_State.

Constructors

Instances3Eq, Generic, Rep
valuenewstate :: IO State
#

Creates a new Lua state. It calls lua_newstate with an allocator based on the standard C realloc function and then sets a panic function (see §4.4 of the Lua 5.4 Reference Manual) that prints an error message to the standard error output in case of fatal errors.

Wraps hsluaL_newstate. See also: luaL_newstate.

valueclose :: State -> IO ()
#

Destroys all objects in the given Lua state (calling the corresponding garbage-collection metamethods, if any) and frees all dynamic memory used by this state. On several platforms, you may not need to call this function, because all resources are naturally released when the host program ends. On the other hand, long-running programs that create multiple states, such as daemons or web servers, will probably need to close states as soon as they are not needed.

Same as lua_close.

Basic stack manipulation

valuegettop :: LuaE e StackIndex
#

Returns the index of the top element in the stack. Because indices start at 1, this result is equal to the number of elements in the stack (and so 0 means an empty stack).

Wraps lua_gettop.

valuesettop :: StackIndex -> LuaE e ()
#

Accepts any index, or 0, and sets the stack top to this index. If the new top is larger than the old one, then the new elements are filled with nil. If index is 0, then all stack elements are removed.

Wraps lua_settop.

valuecopy :: StackIndex -> StackIndex -> LuaE e ()
#

Copies the element at index fromidx into the valid index toidx, replacing the value at that position. Values at other positions are not affected.

Wraps lua_copy.

valueinsert :: StackIndex -> LuaE e ()
#

Moves the top element into the given valid index, shifting up the elements above this index to open space. This function cannot be called with a pseudo-index, because a pseudo-index is not an actual stack position.

Wraps lua_insert.

valuerotate
  1. :: StackIndex
    idx
  2. -> Int
    n
  3. -> LuaE e ()
#

Rotates the stack elements between the valid index idx and the top of the stack. The elements are rotated n positions in the direction of the top, for a positive n, or -n positions in the direction of the bottom, for a negative n. The absolute value of n must not be greater than the size of the slice being rotated. This function cannot be called with a pseudo-index, because a pseudo-index is not an actual stack position.

https://www.lua.org/manual/5.4/manual.html#lua_rotate

valueremove :: StackIndex -> LuaE e ()
#

Removes the element at the given valid index, shifting down the elements above this index to fill the gap. This function cannot be called with a pseudo-index, because a pseudo-index is not an actual stack position.

Wraps lua_remove.

valuereplace :: StackIndex -> LuaE e ()
#

Moves the top element into the given valid index without shifting any element (therefore replacing the value at that given index), and then pops the top element.

Wraps lua_replace.

valuecheckstack :: Int -> LuaE e Bool
#

Ensures that the stack has space for at least n extra slots (that is, that you can safely push up to n values into it). It returns false if it cannot fulfill the request, either because it would cause the stack to be larger than a fixed maximum size (typically at least several thousand elements) or because it cannot allocate memory for the extra space. This function never shrinks the stack; if the stack already has space for the extra slots, it is left unchanged.

Wraps lua_checkstack.

types and type checks

datadata Type
#

Enumeration used as type tag. See lua_type.

Constructors

Instances6Bounded, Enum, Eq, Ord, Read, Show
  • Bounded TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Enum TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Eq TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Ord TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Read TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Show TypeDefined in hslua-core-2.3.2 · HsLua.Core.Types

access functions (stack → Haskell)

valuetoboolean :: StackIndex -> LuaE e Bool
#

Converts the Lua value at the given index to a haskell boolean value. Like all tests in Lua, toboolean returns True for any Lua value different from false and nil; otherwise it returns False. (If you want to accept only actual boolean values, use isboolean to test the value's type.)

Wraps lua_toboolean.

valuetointeger :: StackIndex -> LuaE e (Maybe Integer)
#

Converts the Lua value at the given acceptable index to the signed integral type Integer. The Lua value must be an integer, a number or a string convertible to an integer (see §3.4.3 of the Lua 5.4 Reference Manual); otherwise, tointeger returns Nothing.

If the number is not an integer, it is truncated in some non-specified way.

Wraps lua_tointegerx. See also: lua_tointeger.

valuetopointer :: StackIndex -> LuaE e (Ptr ())
#

Converts the value at the given index to a generic C pointer (void*). The value can be a userdata, a table, a thread, or a function; otherwise, lua_topointer returns nullPtr. Different objects will give different pointers. There is no way to convert the pointer back to its original value.

Typically this function is used only for hashing and debug information.

Wraps lua_topointer.

valuetouserdata :: StackIndex -> LuaE e (Maybe (Ptr a))
#

If the value at the given index is a full userdata, returns its block address. If the value is a light userdata, returns its pointer. Otherwise, returns Nothing..

Wraps lua_touserdata.

valuerawlen :: StackIndex -> LuaE e Int
#

Returns the raw "length" of the value at the given index: for strings, this is the string length; for tables, this is the result of the length operator (#) with no metamethods; for userdata, this is the size of the block of memory allocated for the userdata; for other values, it is 0.

Wraps lua_rawlen.

Comparison and arithmetic functions

datadata RelationalOperator
#

Lua comparison operations.

Constructors

  • EQ

    Correponds to Lua's equality (==) operator.

  • LT

    Correponds to Lua's strictly-lesser-than (<) operator

  • LE

    Correponds to Lua's lesser-or-equal (<=) operator

Instances3Eq, Ord, Show

Compares two Lua values. Returns True if the value at index idx1 satisfies op when compared with the value at index idx2, following the semantics of the corresponding Lua operator (that is, it may call metamethods). Otherwise returns False. Also returns False if any of the indices is not valid.

The value of op must be of type RelationalOperator:

EQ: compares for equality (==) LT: compares for less than (<) LE: compares for less or equal (<=)

Wraps hslua_compare. See also lua_compare.

valueequal
  1. :: LuaError e
  2. => StackIndex

    index1

  3. -> StackIndex

    index2

  4. -> LuaE e Bool
#

Returns True if the two values in acceptable indices index1 and index2 are equal, following the semantics of the Lua == operator (that is, may call metamethods). Otherwise returns False. Also returns False if any of the indices is non valid. Uses compare internally.

valuerawequal :: StackIndex -> StackIndex -> LuaE e Bool
#

Returns True if the two values in indices idx1 and idx2 are primitively equal (that is, without calling the __eq metamethod). Otherwise returns False. Also returns False if any of the indices are not valid.

Wraps lua_rawequal.

push functions (Haskell → stack)

valuepushcfunction :: CFunction -> LuaE e ()
#

Pushes a C function onto the stack. This function receives a pointer to a C function and pushes onto the stack a Lua value of type function that, when called, invokes the corresponding C function.

Any function to be callable by Lua must follow the correct protocol to receive its parameters and return its results (see CFunction)

Same as flip pushcclosure 0. lua_pushcfunction.

valuepushcclosure
  1. :: CFunction
  2. -> NumArgs

    n

  3. -> LuaE e ()
#

Pushes a new C closure onto the stack.

When a C function is created, it is possible to associate some values with it, thus creating a C closure (see §3.4); these values are then accessible to the function whenever it is called. To associate values with a C function, first these values should be pushed onto the stack (when there are multiple values, the first value is pushed first). Then pushcclosure is called to create and push the C function onto the stack, with the argument n telling how many values should be associated with the function. pushcclosure also pops these values from the stack.

The maximum value for n is 255.

Wraps lua_pushcclosure.

valuepushlightuserdata :: Ptr a -> LuaE e ()
#

Pushes a light userdata onto the stack.

Userdata represent C values in Lua. A light userdata represents a pointer, a Ptr a (i.e., void* in C). It is a value (like a number): you do not create it, it has no individual metatable, and it is not collected (as it was never created). A light userdata is equal to "any" light userdata with the same C address.

Wraps lua_pushlightuserdata.

valuepushstring :: ByteString -> LuaE e ()
#

Pushes the string pointed to by s onto the stack. Lua makes (or reuses) an internal copy of the given string, so the memory at s can be freed or reused immediately after the function returns.

Wraps lua_pushlstring.

valuepushthread :: LuaE e Bool
#

Pushes the current thread onto the stack. Returns True if this thread is the main thread of its state, False otherwise.

Wraps lua_pushthread.

get functions (Lua → stack)

valuegettable :: LuaError e => StackIndex -> LuaE e Type
#

Pushes onto the stack the value t[k], where t is the value at the given index and k is the value at the top of the stack.

This function pops the key from the stack, pushing the resulting value in its place. As in Lua, this function may trigger a metamethod for the "index" event (see §2.4 of Lua's manual).

Errors on the Lua side are caught and rethrown.

Wraps hslua_gettable. See also: lua_gettable.

valuegetfield :: LuaError e => StackIndex -> Name -> LuaE e Type
#

Pushes onto the stack the value t[k], where t is the value at the given stack index. As in Lua, this function may trigger a metamethod for the "index" event (see §2.4 of Lua's manual).

Errors on the Lua side are propagated.

See also lua_getfield.

valuecreatetable :: Int -> Int -> LuaE e ()
#

Creates a new empty table and pushes it onto the stack. Parameter narr is a hint for how many elements the table will have as a sequence; parameter nrec is a hint for how many other elements the table will have. Lua may use these hints to preallocate memory for the new table. This preallocation is useful for performance when you know in advance how many elements the table will have. Otherwise you can use the function lua_newtable.

Wraps lua_createtable.

valuenewtable :: LuaE e ()
#

Creates a new empty table and pushes it onto the stack. It is equivalent to createtable 0 0.

See also: lua_newtable.

valuenewuserdatauv
  1. :: Int

    size

  2. -> Int

    nuvalue

  3. -> LuaE e (Ptr ())
#

This function creates and pushes on the stack a new full userdata, with nuvalue associated Lua values, called user values, plus an associated block of raw memory with size bytes. (The user values can be set and read with the functions lua_setiuservalue and lua_getiuservalue.)

The function returns the address of the block of memory. Lua ensures that this address is valid as long as the corresponding userdata is alive (see §2.5). Moreover, if the userdata is marked for finalization (see §2.5.3), its address is valid at least until the call to its finalizer.

This function wraps lua_newuserdatauv.

valuegetmetatable :: StackIndex -> LuaE e Bool
#

If the value at the given index has a metatable, the function pushes that metatable onto the stack and returns True. Otherwise, the function returns False and pushes nothing on the stack.

Wraps lua_getmetatable.

set functions (stack → Lua)

valuesettable :: LuaError e => StackIndex -> LuaE e ()
#

Does the equivalent to t[k] = v, where t is the value at the given index, v is the value at the top of the stack, and k is the value just below the top.

This function pops both the key and the value from the stack. As in Lua, this function may trigger a metamethod for the "newindex" event (see §2.4 of the Lua 5.4 Reference Manual).

Errors on the Lua side are caught and rethrown.

Wraps hslua_settable.

valuesetfield :: LuaError e => StackIndex -> Name -> LuaE e ()
#

Does the equivalent to t[k] = v, where t is the value at the given index and v is the value at the top of the stack.

This function pops the value from the stack. As in Lua, this function may trigger a metamethod for the "newindex" event (see §2.4 of the Lua 5.4 Reference Manual).

Errors on the Lua side are caught and rethrown as a Exception.

See also: lua_setfield.

valuerawseti :: LuaError e => StackIndex -> Integer -> LuaE e ()
#

Does the equivalent of t[i] = v, where t is the table at the given index and v is the value at the top of the stack.

This function pops the value from the stack. The assignment is raw, that is, it does not invoke the __newindex metamethod.

Wraps lua_rawseti.

valuesetiuservalue
  1. :: StackIndex

    index

  2. -> Int

    n

  3. -> LuaE e Bool
#

Pops a value from the stack and sets it as the new n-th user value associated to the full userdata at the given index. Returns 0 if the userdata does not have that value.

Wraps lua_setiuservalue.

load and call functions (load and run Lua code)

valuecall :: LuaError e => NumArgs -> NumResults -> LuaE e ()
#

Calls a function.

To call a function you must use the following protocol: first, the function to be called is pushed onto the stack; then, the arguments to the function are pushed in direct order; that is, the first argument is pushed first. Finally you call call; nargs is the number of arguments that you pushed onto the stack. All arguments and the function value are popped from the stack when the function is called. The function results are pushed onto the stack when the function returns. The number of results is adjusted to nresults, unless nresults is multret. In this case, all results from the function are pushed. Lua takes care that the returned values fit into the stack space. The function results are pushed onto the stack in direct order (the first result is pushed first), so that after the call the last result is on the top of the stack.

Any error inside the called function is propagated as exception of type e.

The following example shows how the host program can do the equivalent to this Lua code:

a = f("how", t.x, 14)

Here it is in Haskell (assuming the OverloadedStrings language extension):

getglobal "f"         -- function to be called
pushstring  "how"     -- 1st argument
getglobal "t"         -- table to be indexed
getfield (-1) "x"     -- push result of t.x (2nd arg)
remove (-2)           -- remove 't' from the stack
pushinteger 14        -- 3rd argument
call 3 1              -- call 'f' with 3 arguments and 1 result
setglobal "a"         -- set global 'a'

Note that the code above is "balanced": at its end, the stack is back to its original configuration. This is considered good programming practice.

See lua_call.

Calls a function in protected mode.

Both nargs and nresults have the same meaning as in call. If there are no errors during the call, pcall behaves exactly like call. However, if there is any error, pcall catches it, pushes a single value on the stack (the error message), and returns the error code. Like call, pcall always removes the function and its arguments from the stack.

If msgh is Nothing, then the error object returned on the stack is exactly the original error object. Otherwise, when msgh is Just idx, the stack index idx is the location of a message handler. (This index cannot be a pseudo-index.) In case of runtime errors, this function will be called with the error object and its return value will be the object returned on the stack by pcall.

Typically, the message handler is used to add more debug information to the error object, such as a stack traceback. Such information cannot be gathered after the return of pcall, since by then the stack has unwound.

This function wraps lua_pcall.

valueload :: Reader -> Ptr () -> Name -> LuaE e Status
#

Loads a Lua chunk (without running it). If there are no errors, load pushes the compiled chunk as a Lua function on top of the stack. Otherwise, it pushes an error message.

The return values of load are:

  • OK: no errors;

  • ErrSyntax: syntax error during pre-compilation;

  • ErrMem: memory allocation error;

  • ErrGcmm: error while running a __gc metamethod. (This error has no relation with the chunk being loaded. It is generated by the garbage collector.)

This function only loads a chunk; it does not run it.

load automatically detects whether the chunk is text or binary, and loads it accordingly (see program luac).

The load function uses a user-supplied reader function to read the chunk (see Reader). The data argument is an opaque value passed to the reader function.

The chunkname argument gives a name to the chunk, which is used for error messages and in debug information (see §4.7). Note that the chunkname is used as a C string, so it may not contain null-bytes.

This is a wrapper of lua_load.

valueloadbuffer
  1. :: ByteString

    Program to load

  2. -> Name

    chunk name

  3. -> LuaE e Status
#

Loads a ByteString as a Lua chunk.

This function returns the same results as load. name is the chunk name, used for debug information and error messages. Note that name is used as a C string, so it may not contain null-bytes.

Wraps luaL_loadbuffer.

valueloadfile
  1. :: Maybe FilePath

    filename

  2. -> LuaE e Status
#

Loads a file as a Lua chunk. This function uses lua_load (see load) to load the chunk in the file named filename. If filename is Nothing, then it loads from the standard input. The first line in the file is ignored if it starts with a #.

The string mode works as in function load.

This function returns the same results as load, but it has an extra error code ErrFile for file-related errors (e.g., it cannot open or read the file).

As load, this function only loads the chunk; it does not run it.

See luaL_loadfile.

valueloadstring :: ByteString -> LuaE e Status
#

Loads a string as a Lua chunk. This function uses lua_load to load the chunk in the given ByteString. The given string may not contain any NUL characters.

This function returns the same results as lua_load (see load).

Also as load, this function only loads the chunk; it does not run it.

See luaL_loadstring.

Coroutine functions

datadata Status
#

Lua status values.

Constructors

  • OK

    success

  • Yield

    yielding / suspended coroutine

  • ErrRun

    a runtime rror

  • ErrSyntax

    syntax error during precompilation

  • ErrMem

    memory allocation (out-of-memory) error.

  • ErrErr

    error while running the message handler.

  • ErrFile

    opening or reading a file failed.

Instances2Eq, Show
  • Eq StatusDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Show StatusDefined in hslua-core-2.3.2 · HsLua.Core.Types
valuestatus :: LuaE e Status
#

Returns the status of this Lua thread.

The status can be OK for a normal thread, an error value if the thread finished the execution of a lua_resume with an error, or Yield if the thread is suspended.

You can only call functions in threads with status OK. You can resume threads with status OK (to start a new coroutine) or Yield (to resume a coroutine).

Wraps lua_status.

garbage-collection function and options

datadata GCControl
#

Commands to control the garbage collector.

Constructors

  • GCStop

    stops the garbage collector.

  • GCRestart

    restarts the garbage collector

  • GCCollect

    performs a full garbage-collection cycle.

  • GCCount

    returns the current amount of memory (in Kbytes) in use by Lua.

  • GCCountb

    returns the remainder of dividing the current amount of bytes of memory in use by Lua by 1024.

  • GCStep CInt

    performs an incremental step of garbage collection, corresponding to the allocation of stepsize Kbytes.

  • GCInc CInt CInt CInt

    Changes the collector to incremental mode with the given parameters (see <https://www.lua.org/manual/5.4/manual.html#2.5.1 §2.5.1>). Returns the previous mode (LUA_GCGEN or LUA_GCINC). Parameters: pause, stepmul, and stepsize.

  • GCGen CInt CInt

    Changes the collector to generational mode with the given parameters (see <https://www.lua.org/manual/5.4/manual.html#2.5.2 §2.5.2>). Returns the previous mode (LUA_GCGEN or LUA_GCINC).

  • GCIsRunning

    returns a boolean that tells whether the collector is running (i.e., not stopped).

Instances3Eq, Ord, Show
  • Eq GCControlDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Ord GCControlDefined in hslua-core-2.3.2 · HsLua.Core.Types
  • Show GCControlDefined in hslua-core-2.3.2 · HsLua.Core.Types
valuegc :: GCControl -> LuaE e Int
#

Controls the garbage collector.

This function performs several tasks, according to the given control command. See the documentation for GCControl.

Wraps lua_gc.

miscellaneous and helper functions

valuenext :: LuaError e => StackIndex -> LuaE e Bool
#

Pops a key from the stack, and pushes a key–value pair from the table at the given index (the "next" pair after the given key). If there are no more elements in the table, then next returns False (and pushes nothing).

Errors on the Lua side are caught and rethrown as a Exception.

This function wraps hslua_next. See also: lua_next.

valueerror :: LuaE e NumResults
#

Signals to Lua that an error has occurred and that the error object is at the top of the stack.

valueconcat :: LuaError e => NumArgs -> LuaE e ()
#

Concatenates the n values at the top of the stack, pops them, and leaves the result at the top. If n is 1, the result is the single value on the stack (that is, the function does nothing); if n is 0, the result is the empty string. Concatenation is performed following the usual semantics of Lua (see §3.4.6 of the Lua manual).

Wraps hslua_concat. See also lua_concat.

valuesetwarnf
  1. :: WarnFunction

    f

  2. -> Ptr ()

    ud

  3. -> LuaE e ()
#

Sets the warning function to be used by Lua to emit warnings (see WarnFunction). The ud parameter sets the value ud passed to the warning function.

loading libraries

9 declarations
valueopenlibs :: LuaE e ()
#

Opens all standard Lua libraries into the current state and sets each library name as a global value.

This function wraps luaL_openlibs.

Auxiliary library

11 declarations
valuecheckstack'
  1. :: LuaError e
  2. => Int

    sz (requested additional size)

  3. -> String

    msg

  4. -> LuaE e ()
#

Grows the stack size to top + sz elements, raising an error if the stack cannot grow to that size. msg is an additional text to go into the error message (or the empty string for no additional text).

valuedostring :: ByteString -> LuaE e Status
#

Loads and runs the given string.

Returns OK on success, or an error if either loading of the string or calling of the thunk failed.

valuedofile :: Maybe FilePath -> LuaE e Status
#

Loads and runs the given file. Note that the filepath is interpreted by Lua, not Haskell. The resulting chunk is named using the UTF8 encoded filepath.

valuegetmetafield
  1. :: StackIndex

    obj

  2. -> Name

    e

  3. -> LuaE e Type
#

Pushes onto the stack the field e from the metatable of the object at index obj and returns the type of the pushed value. If the object does not have a metatable, or if the metatable does not have this field, pushes nothing and returns TypeNil.

Wraps luaL_getmetafield.

valuegetsubtable
  1. :: LuaError e
  2. => StackIndex

    idx

  3. -> Name

    fname

  4. -> LuaE e Bool
#

Ensures that the value t[fname], where t is the value at index idx, is a table, and pushes that table onto the stack. Returns True if it finds a previous table there and False if it creates a new table.

valuenewmetatable :: Name -> LuaE e Bool
#

If the registry already has the key tname, returns False. Otherwise, creates a new table to be used as a metatable for userdata, adds to this new table the pair __name = tname, adds to the registry the pair [tname] = new table, and returns True. (The entry __name is used by some error-reporting functions.)

In both cases pushes onto the stack the final value associated with tname in the registry.

The value of tname is used as a C string and hence must not contain null bytes.

Wraps luaL_newmetatable.

valuerequiref
  1. :: LuaError e
  2. => Name

    modname

  3. -> CFunction

    openf

  4. -> Bool

    glb

  5. -> LuaE e ()
#

If modname is not already present in package.loaded. calls function openf with string modname as an argument and sets the call result in package.loaded[modname], as if that function has been called through require.

If glb is true, also stores the module into global modname.

Leaves a copy of the module on the stack.

See requirehs for a version intended to be used with Haskell actions.

Converts any Lua value at the given index to a ByteString in a reasonable format. The resulting string is pushed onto the stack and also returned by the function.

If the value has a metatable with a __tostring field, then tolstring' calls the corresponding metamethod with the value as argument, and uses the result of the call as its result.

Wraps hsluaL_tolstring.

valuetraceback :: State -> Maybe ByteString -> Int -> LuaE e ()
#

Creates and pushes a traceback of the stack L1. If a message is given it is appended at the beginning of the traceback. The level parameter tells at which level to start the traceback.

Wraps luaL_traceback.

valuewhere'
  1. :: Int

    lvl

  2. -> LuaE e ()
#

Pushes onto the stack a string identifying the current position of the control at level lvl in the call stack. Typically this string has the following format:

chunkname:currentline:

Level 0 is the running function, level 1 is the function that called the running function, etc.

This function is used to build a prefix for error messages.

References

valueref :: StackIndex -> LuaE e Reference
#

Creates and returns a reference, in the table at index t, for the object at the top of the stack (and pops the object).

A reference is a unique integer key. As long as you do not manually add integer keys into table t, ref ensures the uniqueness of the key it returns. You can retrieve an object referred by reference r by calling rawgeti t r. Function unref frees a reference and its associated object.

If the object at the top of the stack is nil, ref returns the constant refnil. The constant noref is guaranteed to be different from any reference returned by ref.

Wraps luaL_ref.

valueunref
  1. :: StackIndex

    idx

  2. -> Reference

    ref

  3. -> LuaE e ()
#

Releases reference ref from the table at index idx (see ref). The entry is removed from the table, so that the referred object can be collected. The reference ref is also freed to be used again.

Wraps luaL_unref. See also: luaL_unref.

valuenoref :: Int
#

Value signaling that no reference was found.

valuerefnil :: Int
#

Value signaling that no reference was created.

Registry fields

valueloaded :: Name
#

Key to the registry field that holds the table of loaded modules.

valuepreload :: Name
#

Key to the registry field that holds the table of loader functions.

Running with tracebacks

Warnings

valuesetwarnf' :: LuaError e => (ByteString -> LuaE e ()) -> LuaE e ()
#

Sets a warning function. This is a simplified version of lua_setwarnf. The given function is called with the concatenated warning components as the single argument.

Control messages are handled internally and are not passed on the warning hook. As with the default warning function, the control messages @on and @off can switch error reporting to stderr on and off. The given Haskell function will be called in either case, even when the error is not written to stderr.

Wraps hsluaL_setwarnf.

Debug interface

2 declarations
valuegetupvalue
  1. :: StackIndex

    funcindex

  2. -> Int

    n

  3. -> LuaE e (Maybe Name)
#

Gets information about the n-th upvalue of the closure at index funcindex. It pushes the upvalue's value onto the stack and returns its name. Returns Nothing (and pushes nothing) when the index n is greater than the number of upvalues.

See debug.getupvalue for more information about upvalues.

[0, +(0|1), -]

Wraps lua_getupvalue.

valuesetupvalue
  1. :: StackIndex

    funcindex

  2. -> Int

    n

  3. -> LuaE e (Maybe Name)
#

Sets the value of a closure’s upvalue. It assigns the value on the top of the stack to the upvalue and returns its name. It also pops the value from the stack.

Returns Nothing (and pops nothing) when the index n is greater than the number of upvalues.

Parameters funcindex and n are as in the function getupvalue.

[-(0|1), +0, -]

Wraps lua_setupvalue.

Haskell userdata values

4 declarations

Push arbitrary Haskell values to the Lua stack.

valuenewhsuserdatauv
  1. :: a

    Haskell object

  2. -> Int

    number of extra userdata values

  3. -> LuaE e ()
#

Creates a new userdata wrapping the given Haskell object. The userdata is pushed to the top of the stack.

valuenewudmetatable :: Name -> LuaE e Bool
#

Creates and registers a new metatable for a userdata-wrapped Haskell value; checks whether a metatable of that name has been registered yet and uses the registered table if possible.

Returns True if a new metatable was created, and False otherwise.

Using a metatable created by this functions ensures that the pointer to the Haskell value will be freed when the userdata object is garbage collected in Lua.

The name may not contain a nul character.

valuefromuserdata
  1. :: StackIndex

    stack index of userdata

  2. -> Name

    expected name of userdata object

  3. -> LuaE e (Maybe a)
#

Retrieves a Haskell object from userdata at the given index. The userdata must have the given name.

valueputuserdata
  1. :: StackIndex

    index

  2. -> Name

    name

  3. -> a

    new value

  4. -> LuaE e Bool
#

Replaces the Haskell value contained in the userdata value at index. Checks that the userdata is of type name and returns True on success, or False otherwise.

Haskell functions and closures

Pushes Haskell function as a callable userdata. All values created will be garbage collected. The function should behave similar to a CFunction.

Error conditions should be indicated by raising a catchable exception or by returning the result of Lua.error.

Example:

mod23 :: Lua NumResults
mod23 = do
  mn <- tointeger (nthBottom 1)
  case mn of
    Nothing -> pushstring "expected an integer" *> error
    Just n  -> pushinteger (n `mod` 23)
pushHaskellFunction mod23
setglobal "mod23"
valuepushPreCFunction :: PreCFunction -> LuaE e ()
#

Converts a pre C function to a Lua function and pushes it to the stack.

Pre C functions collect parameters from the stack and return a CInt that represents number of return values left on the stack. See CFunction for more info.

Error handling

7 declarations
classclass Exception e => LuaError e where
#

Any type that you wish to use for error handling in HsLua must be an instance of the LuaError class.

Methods

  • popException :: LuaE e e

    Converts the error at the top of the stack into an exception and pops the error off the stack.

    This function is expected to produce a valid result for any Lua value; neither a Haskell exception nor a Lua error may result when this is called.

  • pushException :: e -> LuaE e ()

    Pushes an exception to the top of the Lua stack. The pushed Lua object is used as an error object, and it is recommended that calling tostring() on the object produces an informative message.

  • luaException :: String -> e

    Creates a new exception with the given message.

Instances1LuaError
valuetry :: Exception e => LuaE e a -> LuaE e (Either e a)
#

Return either the result of a Lua computation or, if an exception was thrown, the error.

Raises an exception that's appropriate when the type of a Lua object at the given index did not match the expected type. The name or description of the expected type is taken as an argument.

Helpers

Retrieve and pop the top object as an error message. This is very similar to tostring', but ensures that we don't recurse if getting the message failed.

This helpful as a "last resort" method when implementing popException.

Package

2 declarations
valuerequirehs
  1. :: LuaError e
  2. => Name

    modname

  3. -> (Name -> LuaE e ())

    openf

  4. -> LuaE e ()
#

Load a module, defined by a Haskell action, under the given name.

Similar to luaL_requiref: If modname is not already present in package.loaded, calls function openf with string modname as an argument and sets the call result in package.loaded[modname], as if that function has been called through require.

Leaves a copy of the module on the stack.