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

Modulelua-2.3.2Haskell2010

Lua

Extend Haskell programs with a Lua interpreter.

This package provides the basic building blocks to integrate Lua into a Haskell program. The library is kept very close to the C Lua API, and users familiar with the C API should have no problem using it.

However, there are important differences of which users must be aware: The method for error signaling used in Lua, based on setjmp and longjmp, is incompatible with the Haskell FFI. All errors must be handled at language boundaries, as failure to do so will lead to unrecoverable crashes. C API functions that can throw Lua errors are still exported, but non-error throwing hslua_ versions are provided as safer alternatives. . The hslua ersatz functions have worse performance than the original versions, but should be fast enough for most use cases.

The Haskell FFI requires all C function that can call back into Haskell to be imported safely. Some of the Lua functions may, directly or indirectly, call a Haskell function, so they are always imported with the safe keyword.

Many API functions can trigger garbage collection. This will lead to problems if Haskell functions are used as part of finalizers (i.e., __gc metamethods). Haskell in finalizers is not supported by default, but can be enabled by unsetting the allow-unsafe-gc flag.

  • 16 types
  • 116 values
  • Packagelua-2.3.2
  • Exports186
  • LanguageHaskell2010
  • LicenceMIT
  • SourceLua.hs

Run Lua operations

1 declaration
valuewithNewState :: (State -> IO a) -> IO a
#

Runs operations on a new Lua State. The state is created when the function is called and closed on return. The state, and all pointers to values within it, must not be used after the function returns.

Example

Run a small Lua operation (prints the major version of Lua).

withNewState $ \l -> do
  luaL_openlibs l
  withCString "print" (lua_getglobal l)
  withCString "_VERSION" (lua_getglobal l)
  lua_pcall l (NumArgs 1) (NumResults 1) (StackIndex 0)

Types

2 declarations
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
typetype Reader = FunPtr (State -> Ptr () -> Ptr CSize -> IO (Ptr CChar))
#

The reader function used by Lua.load. Every time it needs another piece of the chunk, lua_load calls the reader, passing along its data parameter. The reader must return a pointer to a block of memory with a new piece of the chunk and set size to the block size. The block must exist until the reader function is called again. To signal the end of the chunk, the reader must return NULL or set size to zero. The reader function may return pieces of any size greater than zero.

See lua_Reader.

Base Lua types

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, …

Booleans

newtypenewtype LuaBool
#

Boolean value returned by a Lua C API function. This is a CInt and should be interpreted as False iff the value is 0, True otherwise.

Constructors

Instances3Eq, Show, Storable

Stack indices

Function calling

Basic types

Relational operator codes

Codes for arithmetic operations

Status codes

patternpattern LUA_ERRMEM :: StatusCode
#

Memory allocation error. For such errors, Lua does not call the message handler.

Stack index helpers

4 declarations

Functions

0 declarations

State manipulation

valuelua_close :: 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. In 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.

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

valuelua_newthread :: State -> IO State
#

Creates a new thread, pushes it on the stack, and returns a State that represents this new thread. The new thread returned by this function shares with the original thread its global environment, but has an independent execution stack.

There is no explicit function to close or to destroy a thread. Threads are subject to garbage collection, like any Lua object.

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

Basic stack manipulation

valuelua_rotate
  1. :: State
  2. -> StackIndex

    idx

  3. -> CInt

    n

  4. -> IO ()
#

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

valuelua_checkstack
  1. :: State
  2. -> CInt

    n

  3. -> IO LuaBool
#

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.

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

Access functions (stack → Haskell)

valuelua_tointegerx
  1. :: State
  2. -> StackIndex

    index

  3. -> Ptr LuaBool

    isnum

  4. -> IO 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, lua_tointegerx returns 0.

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

If isnum is not NULL, its referent is assigned a boolean value that indicates whether the operation succeeded.

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

valuelua_tolstring
  1. :: State
  2. -> StackIndex

    index

  3. -> Ptr CSize

    len

  4. -> IO (Ptr CChar)
#

Converts the Lua value at the given index to a C string. If len is not NULL, it sets the referent with the string length. The Lua value must be a string or a number; otherwise, the function returns NULL. If the value is a number, then lua_tolstring also changes the actual value in the stack to a string. (This change confuses lua_next when lua_tolstring is applied to keys during a table traversal.)

lua_tolstring returns a pointer to a string inside the Lua state. This string always has a zero ('0') after its last character (as in C), but can contain other zeros in its body.

Because Lua has garbage collection, there is no guarantee that the pointer returned by lua_tolstring will be valid after the corresponding Lua value is removed from the stack.

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

Push functions (Haskell → stack)

Pushes the zero-terminated 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.

Returns a pointer to the internal copy of the string.

If s is NULL, pushes nil and returns NULL.

valuelua_pushcclosure
  1. :: State
  2. -> CFunction

    fn

  3. -> NumArgs

    n

  4. -> IO ()
#

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 lua_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. lua_pushcclosure also pops these values from the stack.

The maximum value for n is 255.

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

valuelua_pushlightuserdata :: State -> Ptr a -> IO ()
#

Pushes a light userdata onto the stack.

Userdata represent C values in Lua. A light userdata represents a pointer, a Ptr () (i.e., void* in C lingo). 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.

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

Get functions (Lua → stack)

valuelua_createtable
  1. :: State
  2. -> CInt

    narr

  3. -> CInt

    nrec

  4. -> IO ()
#

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.

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

valuelua_newuserdatauv
  1. :: State
  2. -> CSize

    size

  3. -> CInt

    nuvalue

  4. -> IO (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.

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

valuelua_getglobal
  1. :: State
  2. -> CString

    name

  3. -> IO TypeCode
#

This is an unsafe function, errors will lead to a program crash; consider using hslua_getglobal instead.

Pushes onto the stack the value of the global name. Returns the type of that value.

WARNING: lua_getglobal is unsafe in Haskell: if the call to a metamethod triggers an error, then that error cannot be handled and will lead to an unrecoverable program crash. Consider using the Lua.hslua_getglobal ersatz function instead. Likewise, the metamethod may not call a Haskell function unless the library was compiled without allow-unsafe-gc.

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

valuelua_gettable
  1. :: State
  2. -> StackIndex

    index

  3. -> IO TypeCode
#

This is an unsafe function, errors will lead to a program crash; consider using hslua_gettable instead.

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).

Returns the type of the pushed value.

WARNING: lua_gettable is unsafe in Haskell: if the call to a metamethod triggers an error, then that error cannot be handled and will lead to an unrecoverable program crash. Consider using the Lua.hslua_gettable ersatz function instead. Likewise, the metamethod may not call a Haskell function unless the library was compiled without allow-unsafe-gc.

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

Set functions (stack → Lua)

valuelua_setglobal
  1. :: State
  2. -> CString

    name

  3. -> IO ()
#

This is an unsafe function, errors will lead to a program crash; consider using hslua_getglobal instead.

Pops a value from the stack and sets it as the new value of global name.

WARNING: lua_setglobal is unsafe in Haskell: if the call to a metamethod triggers an error, then that error cannot be handled and will lead to an unrecoverable program crash. Consider using the Lua.hslua_setglobal ersatz function instead. Likewise, the global metamethod may not call a Haskell function unless the library was compiled without allow-unsafe-gc.

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

valuelua_settable
  1. :: State
  2. -> StackIndex

    index

  3. -> IO ()
#

This is an unsafe function, errors will lead to a program crash; consider using hslua_settable instead.

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).

WARNING: lua_settable is unsafe in Haskell: if the call to a metamethod triggers an error, then that error cannot be handled and will lead to an unrecoverable program crash. Consider using the Lua.hslua_settable ersatz function instead. Likewise, the metamethod may not call a Haskell function unless the library was compiled without allow-unsafe-gc.

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

Misc (safe)

Converts the zero-terminated string s to a number, pushes that number into the stack, and returns the total size of the string, that is, its length plus one. The conversion can result in an integer or a float, according to the lexical conventions of Lua (see §3.1). The string may have leading and trailing spaces and a sign. If the string is not a valid numeral, returns 0 and pushes nothing. (Note that the result can be used as a boolean, true if the conversion succeeds.)

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

Misc (unsafe)

valuelua_arith
  1. :: State
  2. -> ArithOPCode

    op

  3. -> IO ()
#

This is an unsafe function, errors will lead to a program crash; consider using hslua_arith instead.

Performs an arithmetic or bitwise operation over the two values (or one, in the case of negations) at the top of the stack, with the value at the top being the second operand, pops these values, and pushes the result of the operation. The function follows the semantics of the corresponding Lua operator (that is, it may call metamethods).

The value of op must be one of the following constants:

  • LUA_OPADD: performs addition (+)

  • LUA_OPSUB: performs subtraction (-)

  • LUA_OPMUL: performs multiplication (*)

  • LUA_OPDIV: performs float division (/)

  • LUA_OPIDIV: performs floor division (//)

  • LUA_OPMOD: performs modulo (%)

  • LUA_OPPOW: performs exponentiation (^)

  • LUA_OPUNM: performs mathematical negation (unary -)

  • LUA_OPBNOT: performs bitwise NOT (~)

  • LUA_OPBAND: performs bitwise AND (&)

  • LUA_OPBOR: performs bitwise OR (|)

  • LUA_OPBXOR: performs bitwise exclusive OR (~)

  • LUA_OPSHL: performs left shift (<<)

  • LUA_OPSHR: performs right shift (>>)

WARNING: lua_arith is unsafe in Haskell: if the call to a metamethod triggers an error, then that error cannot be handled and will lead to an unrecoverable program crash. Consider using the Lua.hslua_arith ersatz function instead. Likewise, the metamethod may not call a Haskell function unless the library was compiled without allow-unsafe-gc.

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

valuelua_concat
  1. :: State
  2. -> CInt

    n

  3. -> IO ()
#

This is an unsafe function, it will cause a program crash if a metamethod throws an error. Consider using hslua_concat instead.

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).

WARNING: lua_concat is unsafe in Haskell: This function will cause an unrecoverable crash an error if any of the concatenated values causes an error when executing a metamethod. Consider using the Lua.hslua_concat ersatz function instead.

valuelua_next
  1. :: State
  2. -> StackIndex

    index

  3. -> IO LuaBool
#

This is an unsafe function, it will cause a program crash if the given key is neither nil nor present in the table. Consider using hslua_next instead.

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 lua_next returns Lua.FALSE (and pushes nothing).

A typical traversal looks like this:

-- table is in the stack at index 't'
lua_pushnil l    -- first key
let loop = lua_next l t >>= \case
      FALSE -> return ()
      _ -> do
        lua_type l (-2) >>= lua_typename l >>= peekCString >>= putStrLn
        lua_type l (-1) >>= lua_typename l >>= peekCString >>= putStrLn
        -- removes 'value'; keeps 'key' for next iteration
        lua_pop l 1
        loop
loop

While traversing a table, do not call lua_tolstring directly on a key, unless you know that the key is actually a string. Recall that lua_tolstring may change the value at the given index; this confuses the next call to lua_next.

See function next for the caveats of modifying the table during its traversal.

WARNING: lua_next is unsafe in Haskell: This function will cause an unrecoverable crash an error if the given key is neither nil nor present in the table. Consider using the Lua.hslua_next ersatz function instead.

Load and run Lua code

valuelua_pcall
  1. :: State
  2. -> NumArgs

    nargs

  3. -> NumResults

    nresults

  4. -> StackIndex

    msgh

  5. -> IO StatusCode
#

Calls a function in protected mode.

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 lua_pcall; 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 Lua.LUA_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.

If there is any error, lua_pcall catches it, pushes a single value on the stack (the error message), and returns the error code. lua_pcall always removes the function and its arguments from the stack.

If msgh is 0, then the error object returned on the stack is exactly the original error object. Otherwise, msgh 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 lua_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 lua_pcall, since by then the stack has unwound.

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

valuelua_load
  1. :: State
  2. -> Reader

    reader

  3. -> Ptr ()

    data

  4. -> CString

    chunkname

  5. -> CString

    mode

  6. -> IO StatusCode
#

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

The return values of lua_load are:

  • Lua.LUA_OK: no errors;

  • Lua.LUA_ERRSYNTAX: syntax error during pre-compilation;

  • Lua.LUA_ERRMEM: memory allocation error;

  • Lua.LUA_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.

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

The lua_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).

lua_load automatically detects whether the chunk is text or binary and loads it accordingly (see program luac). The string mode works as in function load, with the addition that a NULL value is equivalent to the string "bt".

lua_load uses the stack internally, so the reader function must always leave the stack unmodified when returning.

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

Coroutine functions

valuelua_status :: State -> IO StatusCode
#

Returns the status of this Lua thread.

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

You can only call functions in threads with status Lua.LUA_OK. You can resume threads with status Lua.LUA_OK (to start a new coroutine) or Lua.LUA_YIELD (to resume a coroutine).

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

Garbage-collection

patternpattern LUA_GCCOUNT :: GCCode
#

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

patternpattern LUA_GCCOUNTB :: GCCode
#

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

patternpattern LUA_GCSTEP :: GCCode
#

Performs an incremental step of garbage collection.

patternpattern LUA_GCSETPAUSE :: GCCode
#

Sets data as the new value for the pause of the collector (see §2.5) and returns the previous value of the pause.

patternpattern LUA_GCSETSTEPMUL :: GCCode
#

Sets data as the new value for the step multiplier of the collector (see §2.5) and returns the previous value of the step multiplier.

patternpattern LUA_GCISRUNNING :: GCCode
#

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

patternpattern LUA_GCGEN :: GCCode
#

Changes the collector to generational mode.

patternpattern LUA_GCINC :: GCCode
#

Changes the collector to incremental mode.

Warning-related functions

typetype WarnFunction = FunPtr (Ptr () -> CString -> LuaBool -> IO ())
#

The type of warning functions, called by Lua to emit warnings. The first parameter is an opaque pointer set by lua_setwarnf. The second parameter is the warning message. The third parameter is a boolean that indicates whether the message is to be continued by the message in the next call.

See warn for more details about warnings.

Miscellaneous functions

The Auxiliary Library

9 declarations

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 LUA_TNIL.

valueluaL_loadbuffer
  1. :: State
  2. -> Ptr CChar

    buff

  3. -> CSize

    sz

  4. -> CString

    name

  5. -> IO StatusCode
#

Loads a buffer as a Lua chunk. This function uses lua_load to load the chunk in the buffer pointed to by buff with size sz.

This function returns the same results as lua_load. name is the chunk name, used for debug information and error messages.

valueluaL_newmetatable
  1. :: State
  2. -> CString

    tname

  3. -> IO LuaBool
#

If the registry already has the key tname, returns 0. 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 1. (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.

valueluaL_ref
  1. :: State
  2. -> StackIndex

    t

  3. -> IO CInt
#

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, luaL_ref ensures the uniqueness of the key it returns. You can retrieve an object referred by reference r by calling lua_rawgeti l t r. Function luaL_unref frees a reference and its associated object.

If the object at the top of the stack is nil, luaL_ref returns the constant LUA_REFNIL. The constant LUA_NOREF is guaranteed to be different from any reference returned by luaL_ref.

valueluaL_traceback
  1. :: State

    l

  2. -> State

    l1

  3. -> CString

    msg

  4. -> CInt

    level

  5. -> IO ()
#

Creates and pushes a traceback of the stack l1. If msg is not NULL it is appended at the beginning of the traceback. The level parameter tells at which level to start the traceback.

valueluaL_unref
  1. :: State
  2. -> StackIndex

    t

  3. -> CInt

    ref

  4. -> IO ()
#

Releases reference ref from the table at index t (see luaL_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.

Registry fields

References

patternpattern LUA_REFNIL :: CInt
#

Value signaling that no reference was created.

patternpattern LUA_NOREF :: CInt
#

Value signaling that no reference was found.

Debug interface

2 declarations
valuelua_getupvalue
  1. :: State
  2. -> StackIndex

    funcindex

  3. -> CInt

    n

  4. -> IO CString
#

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 NULL (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), -]

lua_getupvalue.

valuelua_setupvalue
  1. :: State
  2. -> StackIndex

    funcindex

  3. -> CInt

    n

  4. -> IO CString
#

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 NULL (and pops nothing) when the index n is greater than the number of upvalues.

Parameters funcindex and n are as in the function lua_getupvalue.

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

lua_setupvalue.

Ersatz functions

3 declarations
valuehsluaL_requiref
  1. :: State
  2. -> Ptr CChar

    modname

  3. -> CFunction

    openf

  4. -> LuaBool

    glb

  5. -> Ptr StatusCode
  6. -> IO ()
#

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.

Get functions (Lua → stack)

Set functions (stack → Lua)

Misc

valuehslua_arith
  1. :: State
  2. -> ArithOPCode

    op

  3. -> Ptr StatusCode
  4. -> IO ()
#

Performs an arithmetic or bitwise operation over the two values (or one, in the case of negations) at the top of the stack, with the value at the top being the second operand, pops these values, and pushes the result of the operation. The function follows the semantics of the corresponding Lua operator (that is, it may call metamethods).

The value of op must be one of the following constants:

  • LUA_OPADD: performs addition (+)

  • LUA_OPSUB: performs subtraction (-)

  • LUA_OPMUL: performs multiplication (*)

  • LUA_OPDIV: performs float division (/)

  • LUA_OPIDIV: performs floor division (//)

  • LUA_OPMOD: performs modulo (%)

  • LUA_OPPOW: performs exponentiation (^)

  • LUA_OPUNM: performs mathematical negation (unary -)

  • LUA_OPBNOT: performs bitwise NOT (~)

  • LUA_OPBAND: performs bitwise AND (&)

  • LUA_OPBOR: performs bitwise OR (|)

  • LUA_OPBXOR: performs bitwise exclusive OR (~)

  • LUA_OPSHL: performs left shift (<<)

  • LUA_OPSHR: performs right shift (>>)

This function wraps lua_arith and takes an additional parameter status; if it is not NULL, then the return value is set to the status after calling lua_arith.

valuehslua_compare
  1. :: State
  2. -> StackIndex

    index 1

  3. -> StackIndex

    index 2

  4. -> OPCode

    operator

  5. -> Ptr StatusCode

    status

  6. -> IO LuaBool
#

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

The value of op must be one of the following constants:

This function wraps lua_compare and takes an additional parameter status; if it is not NULL, then the return value is set to the status after calling lua_compare.

Simplified warnings handling

valuehsluaL_setwarnf :: State -> IO ()
#

Sets a warning function. This is a simplified version of lua_setwarnf. The function at the top of the stack is set as the "warning hook", i.e., it is called with the concatenated warning components as the single argument.

The hook function is popped of the stack.

The control messages @on and @off are still supported; as with the default warning function, these commands 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.

Standard Lua libraries

8 declarations

Push Haskell functions

1 declaration

Pushes a Haskell operation as a Lua function. The Haskell operation is expected to follow the custom error protocol, i.e., it must signal errors with Lua.hslua_error.

Example

Export the function to calculate triangular numbers.

let triangular :: PreCFunction
    triangular l' = do
      n <- lua_tointegerx l' (nthBottom 1) nullPtr
      lua_pushinteger l' (sum [1..n])
      return (NumResults 1)

hslua_newhsfunction l triangular
withCString "triangular" (lua_setglobal l)

Version and copyright info

3 declarations
patternpattern LUA_VERSION :: String
#

Lua version information in the form "Lua MAJOR.MINOR".

patternpattern LUA_RELEASE :: String
#

Lua version information in the form "Lua MAJOR.MINOR.RELEASE".