base

Adds to the existing global functions

require "list" FIXME: sort out op table


require "io_ext" FIXME: allow loops


metamethod: Return given metamethod, if any, or nil
  x: object to get metamethod of
  n: name of metamethod to get
returns
  m: metamethod function or nil if no metamethod or not a
    function


render: Turn tables into strings with recursion detection
N.B. Functions calling render should not recurse, or recursion
detection will not work
  x: object to convert to string
  open: open table renderer
    @t: table
  returns
    @s: open table string
  close: close table renderer
    @t: table
  returns
    @s: close table string
  elem: element renderer
    @e: element
  returns
    @s: element string
  pair: pair renderer
    N.B. this function should not try to render i and v, or treat
    them recursively
    @t: table
    @i: index
    @v: value
    @is: index string
    @vs: value string
  returns
    @s: element string
  sep: separator renderer
    @t: table
    @i: preceding index (nil on first call)
    @v: preceding value (nil on first call)
    @j: following index (nil on last call)
    @w: following value (nil on last call)
  returns
    @s: separator string
returns
  s: string representation


tostring: Extend tostring to work better on tables
  x: object to convert to string
returns
  s: string representation


print: Make print use tostring, so that improvements to tostring
are picked up
  arg: objects to print


prettytostring: pretty-print a table
  @t: table to print
  @indent: indent between levels ["\t"]
  @spacing: space before every line
returns
  @s: pretty-printed string


totable: Turn an object into a table according to __totable
metamethod
  x: object to turn into a table
returns
  t: table or nil


pickle: Convert a value to a string
The string can be passed to dostring to retrieve the value
TODO: Make it work for recursive tables
  x: object to pickle
returns
  s: string such that eval (s) is the same value as x


id: Identity
  @param ...
returns
  ...: the arguments passed to the function


pack: Turn a tuple into a list
  ...: tuple
returns
  l: list


bind: Partially apply a function
  f: function to apply partially
  a1 ... an: arguments to bind
returns
  g: function with ai already bound


curry: Curry a function
  f: function to curry
  n: number of arguments
returns
  g: curried version of f


compose: Compose functions
  f1 ... fn: functions to compose
returns
  g: composition of f1 ... fn
    args: arguments
  returns
    @param f1 (...fn (args)...)


eval: Evaluate a string
  s: string
returns
  v: value of string


ripairs: An iterator like ipairs, but in reverse
  t: table to iterate over
returns
  f: iterator function
    t: table
    n: index
  returns
    i: index (n - 1)
    v: value (t[n - 1])
  t: the table, as above
  n: #t + 1


collect: collect the results of an iterator
  i: iterator
  ...: arguments
returns
  @t: results of running the iterator on its arguments


map: Map a function over an iterator
  f: function
  i: iterator
  ...: iterator's arguments
returns
  t: result table


filter: Filter an iterator with a predicate
  p: predicate
  i: iterator
  ...:
returns
  t: result table containing elements e for which p (e)


fold: Fold a function into an iterator leftwards
  f: function
  d: element to place in left-most position
  i: iterator
  ...:
returns
  r: result


treeIter: tree iterator
  t: tree to iterate over
returns
  f: iterator function
  returns
    e: event
    t: table of values


FIXME: this version is more obvious but has an illegal yield
treeIter: tree iterator
  t: tree to iterate over
returns
  f: iterator function
  returns
    e: event
    t: table of values
function _G.treeIter (t)
  if not coroutine.yield ("branch", t) then
    for i, v in ipairs (t) do
      if type (v) ~= "table" then
        if coroutine.yield ("leaf", {i, v}) then
          break
        end
      else
        f (v)
      end
    end
    coroutine.yield ("join", t)
  end
end


assert: Extend to allow formatted arguments
  v: value
  ...: arguments for format
returns
  v: value


warn: Give warning with the name of program and file (if any)
  ...: arguments for format


die: Die with error
  ...: arguments for format


Function forms of operators