Module std.normalize

Normalize API differences between supported Lua implementations.

Respecting the values set in the std._debug settings module, inject deterministic identically behaving cross-implementation low-level functions into the callers environment.

Writing Lua libraries that target several Lua implementations can be a frustrating exercise in working around lots of small differences in APIs and semantics they share (or rename, or omit). normalize provides the means to simply access deterministic implementations of those APIs that have the the same semantics across all supported host Lua implementations. Each function is as thin and fast an implementation as is possible within that host Lua environment, evaluating to the Lua C implementation with no overhead where host semantics allow.

The core of this module is to transparently set the environment up with a single API (as opposed to requiring caching functions from a module table into module locals):

local _ENV = require 'std.normalize' {
   'package',
   'std.prototype',
   strict = 'std.strict',
}

It is not yet complete, and in contrast to the kepler project lua-compat libraries, neither does it attempt to provide you with as nearly compatible an API as is possible relative to some specific Lua implementation - rather it provides a variation of the "lowest common denominator" that can be implemented relatively efficiently in the supported Lua implementations, all in pure Lua.

At the moment, only the functionality used by stdlib is implemented.

Functions

argerror (name, i[, extramsg[, level=1]]) Raise a bad argument error.
getfenv (fn) Get a function or functor environment.
getmetamethod (x, n) Return named metamethod, if callable, otherwise nil.
ipairs (t) Iterate over elements of a sequence, until the first nil value.
len (x) Deterministic, functional version of core Lua # operator.
load (ld, source) Load a string or a function, just like Lua 5.2+.
pack (...) Return a list of given arguments, with field n set to the length.
pairs (t) Like Lua pairs iterator, but respect __pairs even in Lua 5.1.
rawlen (x) Length of a string or table object without using any metamethod.
setfenv (fn, env) Set a function or functor environment.
str (x) Return a compact stringified representation of argument.
unpack (t[, i=1[, j=len(t)]]) Either table.unpack in newer-, or unpack in older Lua implementations.
xpcall (f, errh, ...) Support arguments to a protected function call, even on Lua 5.1.
math.tointeger (x) Convert to an integer and return if possible, otherwise nil.
math.type (x) Return 'integer', 'float' or nil according to argument type.
os.exit (status) Exit the program.
package.searchpath (name, path[, sep='.'[, rep=`package.dirsep`]]) Searches for a named file in a given path.
string.render (x, vfns[, roots]) Low-level recursive data to string rendering.
table.keys (t) Return an unordered list of all keys in a table.
table.merge (t[, u={}]) Destructively merge keys and values from one table into another.

Tables

package Package module constants for package.config substrings.

Metamethods

__call (env[, level=1]) Normalize caller's lexical environment.
__index (name) Lazy loading of normalize modules.

Types

RenderFns Table of functions for string.render.
RenderElem (x) Type of function for uniquely stringifying rendered element.
RenderTerm (x) Type of predicate function for terminal elements.
RenderSort (keys) Type of function for sorting keys of a recursively rendered element.
RenderOpen (x) Type of function to get string for before first element.
RenderClose (x) Type of function te get string for after last element.
RenderPair (x, kp, vp, k, v, kstr, vstr, seqp) Type of function to render a key value pair.
RenderSep (x, kp, vp, kn, vn, seqp) Type of function to render a separator between pairs.


Functions

argerror (name, i[, extramsg[, level=1]])
Raise a bad argument error. Equivalent to luaL_argerror in the Lua C API. This function does not return. The level argument behaves just like the core error function.

Parameters:

Usage:

getfenv (fn)
Get a function or functor environment. This version of getfenv works on all supported Lua versions, and knows how to unwrap functors (table's with a function valued __call metamethod).

Parameters:

Returns:

    table the execution environment of fn

Usage:

getmetamethod (x, n)
Return named metamethod, if callable, otherwise nil.

Parameters:

Returns:

    function or nil

    metamethod function, or nil if no

    metamethod
    

Usage:

ipairs (t)
Iterate over elements of a sequence, until the first nil value.

Returns successive key-value pairs with integer keys starting at 1, up to the index returned by the __len metamethod if any, or else up to last non-nil value.

Unlike Lua 5.1, any __index metamethod is respected.

Unlike Lua 5.2+, any __ipairs metamethod is ignored!

Parameters:

Returns:

  1. function iterator function
  2. table t the table being iterated over
  3. int the previous iteration index

Usage:

len (x)
Deterministic, functional version of core Lua # operator. Respects __len metamethod (like Lua 5.2+), or else if there is a __tostring metamethod return the length of the string it returns. Otherwise, always return one less than the lowest integer index with a nil value in x, where the # operator implementation might return the size of the array part of a table.

Parameters:

Returns:

    int the length of x

Usage:

load (ld, source)
Load a string or a function, just like Lua 5.2+.

Parameters:

Returns:

    function a Lua function to execute ld in global scope.

Usage:

pack (...)
Return a list of given arguments, with field n set to the length. The returned table also has a __len metamethod that returns n, so ipairs and unpack behave sanely when there are nil valued elements.

Parameters:

Returns:

    table

    packed list of ... values, with field n set to

    number of tuple elements (including any explicit `nil` elements)
    

See also:

Usage:

pairs (t)
Like Lua pairs iterator, but respect __pairs even in Lua 5.1.

Parameters:

Returns:

  1. function iterator function
  2. table t, the table being iterated over
  3. the previous iteration key

Usage:

rawlen (x)
Length of a string or table object without using any metamethod.

Parameters:

Returns:

    int raw length of x

Usage:

setfenv (fn, env)
Set a function or functor environment. This version of setfenv works on all supported Lua versions, and knows how to unwrap functors.

Parameters:

Returns:

    function function acted upon

Usage:

str (x)
Return a compact stringified representation of argument.

Parameters:

Returns:

    string compact string representing x

Usage:

unpack (t[, i=1[, j=len(t)]])
Either table.unpack in newer-, or unpack in older Lua implementations.

Parameters:

Returns:

    ... values of numeric indices of t

See also:

Usage:

xpcall (f, errh, ...)
Support arguments to a protected function call, even on Lua 5.1.

Parameters:

Returns:

    ... all return values from f follow

Or

  1. boolean false when f(...) raised an error
  2. string error message

Or

    boolean true when f(...) succeeded

Usage:

math.tointeger (x)
Convert to an integer and return if possible, otherwise nil.

Parameters:

Returns:

    integer x converted to an integer if possible

Or

    nil otherwise
math.type (x)
Return 'integer', 'float' or nil according to argument type. To ensure the same behaviour on all host Lua implementations, this function returns 'float' for integer-equivalent floating values, even on Lua 5.3.

Parameters:

Returns:

    string 'integer', if x is a whole number

Or

    string 'float', for other numbers

Or

    nil otherwise
os.exit (status)
Exit the program.

Parameters:

Usage:

package.searchpath (name, path[, sep='.'[, rep=`package.dirsep`]])
Searches for a named file in a given path.

For each package.pathsep delimited template in the given path, search for an readable file made by first substituting for sep with package.dirsep, and then replacing any package.pathmark with the result. The first such file, if any is returned.

Parameters:

Returns:

    string

    first template substitution that names a file

    that can be opened in read mode
    

Or

  1. nil
  2. string error message listing all failed paths
string.render (x, vfns[, roots])
Low-level recursive data to string rendering.

Parameters:

Returns:

    string a text recursive rendering of x using vfns

Usage:

table.keys (t)
Return an unordered list of all keys in a table.

Parameters:

Returns:

    table an unorderd list of keys in t

Usage:

table.merge (t[, u={}])
Destructively merge keys and values from one table into another.

Parameters:

Returns:

    table u

Usage:

Tables

package
Package module constants for package.config substrings.

Fields:

Metamethods

__call (env[, level=1])

Normalize caller's lexical environment.

Using 'std.strict' when available and selected, otherwise a (Lua 5.1 compatible) function to set the given environment.

With an empty table argument, the core (not-table) normalize functions are loaded into the callers environment. For consistent behaviour between supported host Lua implementations, the result must always be assigned back to _ENV. Additional core modules must be named to be loaded at all (i.e. no 'debug' table unless it is explicitly listed in the argument table).

Additionally, external modules are loaded using require, with . separators in the module name translated to nested tables in the module environment. For example 'std.prototype' in the usage below will add to the environment table the equivalent of:

   local prototype = require 'std.prototype'

Alternatively, you can assign a loaded module symbol to a specific environment table symbol with key=value syntax. For example the the 'math.tointeger' from the usage below is equivalent to:

   local int = require 'std.normalize.math'.tointeger

Compare this to loading the non-normalized implementation from the host Lua with a table entry such as:

   int = require 'math'.tointeger,

Finally, explicit string assignment to ALLCAPS keys are not loaded from modules at all, but behave as a constant string assignment:

   INT = 'math.tointeger',

Parameters:

Returns:

    table

    env with this module's functions merge id. Assign

    back to `_ENV`
    

Usage:

__index (name)
Lazy loading of normalize modules. Don't load everything on initial startup, wait until first attempt to access a submodule, and then load it on demand.

Parameters:

Returns:

    table or nil

    the submodule that was loaded to satisfy the missing

    `name`, otherwise `nil` if nothing was found
    

Usage:

Types

RenderFns
Table of functions for string.render.

Fields:

See also:

Usage:

RenderElem (x)
Type of function for uniquely stringifying rendered element.

Parameters:

Returns:

    string stringified x
RenderTerm (x)
Type of predicate function for terminal elements.

Parameters:

Returns:

    bool

    true for terminal elements that should be rendered

    immediately
    
RenderSort (keys)
Type of function for sorting keys of a recursively rendered element.

Parameters:

Returns:

    table sorted list of keys for pairs to be rendered
RenderOpen (x)
Type of function to get string for before first element.

Parameters:

Returns:

    string string to render before first element
RenderClose (x)
Type of function te get string for after last element.

Parameters:

Returns:

    string string to render after last element
RenderPair (x, kp, vp, k, v, kstr, vstr, seqp)
Type of function to render a key value pair.

Parameters:

Returns:

    string stringified rendering of pair kstr and vstr
RenderSep (x, kp, vp, kn, vn, seqp)
Type of function to render a separator between pairs.

Parameters:

Returns:

    string

    stringified rendering of separator between previous and

    next pairs
    

generated by LDoc 1.4.6 Last updated 2020-04-15 17:22:39