Warning
This repository is no longer maintained and has been archived.
Please consider using LuaX instead.
BonaLuna is a Lua interpretor plus a few packages in a single executable.
The current version is 3.0.7
- BonaLuna: Copyright (C) 2010-2020 Christophe Delord, Freely available under the terms of the MIT license
- Lua 5.3: Copyright (C) 2010 Lua.org, PUC-Rio.
- Lua, Lpeg: MIT license
- miniLZO, QuickLZ: GPL v2
- LZ4: BSD
- LZF: GPL
- libcurl: MIT/X derivate
- ser: MIT license
Bonaluna sources can be downloaded here: https://github.com/CDSoft/bonaluna.
The original Lua interpretor and documentation is available at http://www.lua.org.
BonaLuna is based on Lua 5.3.
iter(sequence) returns an iterator of sequence
items (a table).
list(iterator) returns a table of items generated by iterator
.
reverse(iterator) returns iterator
in reverse order.
sort(iterator [, cmp]) returns iterator
sorted using cmp
(as table.sort
)
map(f, ...) applies f
to iterators.
zip(...) groups values of the same rank of several iterators.
filter(p, iterator) selects values according to the predicate p
.
range(i [, j [, s] ]) returns the values of the range [i
, j
].
s
is the step.
range(j)
is equivalent to range(1, j)
. The default step is 1.
enum(iterator) generates tuples (i, x[i])
where i
is the rank of the value x[i]
for each value of iterator
.
chain(...) chains several iterators.
curry(f, ...) returns a curryfied function starting with f and its first arguments (...) if any.
compose(f, g, ...) returns the composed function "f(g(...))".
identity is the identity function.
memoize(f) returns a memoized function.
Objects defined in these packages uses closures 1 to store internal data.
No self is required and methods are called with a single dot (.
),
not with a colon (:
).
Example:
aes = crypt.AES("my key", 128)
encrypted = aes.encrypt("some text")
lbc is a public domain package written by Luiz Henrique de Figueiredo and available at Libraries and tools for Lua
This is a big-number library for Lua 5.3. It is based on the arbitrary precision library number.c written by Philip A. Nelson for GNU bc-1.06: http://www.gnu.org/software/bc/
bc.version is the version number of bc
bc.digits([n]) sets the number of digits used by bc
bc.number(x) builds a big number from a Lua number or a string
bc.tonumber(x) converts a big number to a Lua number
bc.tostring(x), __tostring(x) converts a big number to a string
bc.neg(x), __unm(x) returns -x
bc.add(x,y), __add(x,y) returns x+y
bc.sub(x,y), __sub(x,y) returns x-y
bc.mul(x,y), __mul(x,y) returns x*y
bc.div(x,y), __div(x,y) returns x/y
bc.mod(x,y), __mod(x,y) return x mod y
bc.divmod(x,y) returns [x/y], x mod y
bc.pow(x,y), __pow(x,y) returns x**y
bc.powmod(x,y,m) returns x**y mod m
bc.compare(x,y) returns -1
if x < y, 0
if x == y, +1
if x > y
__eq(x,y), __lt(x,y) compares x and y
bc.iszero(x) is true if x == 0
bc.isneg(x) is true if x < 0
bc.trunc(x,[n]) returns x truncated value
bc.sqrt(x) returns sqrt(x)
bc.number(x) also accepts hexadecimal, octal and binary numbers as strings
Functions of the math and bit32 modules also exist in the bc module. These functions produce bc numbers but work internally with Lua numbers. Do not expect these functions to be precise.
The m package extends the bc package by mixing arbitrary precision integer (bc) and Lua numbers (float). It produces bc integers when possible and Lua numbers otherwise.
bn.Int(x) builds a big integer from a Lua number, a string or a big number
bn.Rat(x) builds a big rational from a Lua number, a string or a big number
bn.Float(x) builds a float from a Lua number, a string or a big number
bn.tonumber(x) converts a big number to a Lua number
bn.tostring(x, base, bits), __tostring(x) converts a big number to a string
__unm(x) returns -x
__add(x,y) returns x+y
__sub(x,y) returns x-y
__mul(x,y) returns x*y
__div(x,y) returns x/y
__idiv(x,y) return x // y
__mod(x,y) return x mod y
bn.divmod(x,y) returns [x/y], x mod y
bn.powmod(x,y,m) returns x**y mod m
__pow(x,y) returns x**y
__eq(x,y), __lt(x,y) compares x and y
x:iszero() is true if x == 0
x:isone() is true if x == 1
bn.zero, bn.one, bn.two big representations of 0
, 1
and 2
bn.bin(x, bits) returns a string representation of x
in base 2 on bits
bits
bn.oct(x, bits) returns a string representation of x
in base 8 on bits
bits
bn.dec(x, bits) returns a string representation of x
in base 10 on bits
bits
bn.hex(x, bits) returns a string representation of x
in base 16 on bits
bits
bn.sep(s) sets the digit separator ("_", " " or nil)
Functions of the math, mathx and bit32 modules also exist in the bn module. These functions produce bn numbers but may work internally with Lua numbers. Do not expect these functions to be precise.
All the functions of mathx are in the math module.
The crypt
package is a pure Lua package (i.e. not really fast).
crypt.hex.encode(data) encodes data
in hexa.
crypt.hex.decode(data) decodes the hexa data
.
crypt.base64.encode(data) encodes data
in base64.
crypt.base64.decode(data) decodes the base64 data
.
crypt.crc32(data) computes the CRC32 of data
.
crypt.shaXXX(data) computes an SHA digest of data
. XXX
is 1, 224 or 256.
crypt.AES(password [,keylen [,mode] ]) returns an AES codec.
password
is the encryption/decryption key, keylen
is the length
of the key (128 (default), 192 or 256), mode
is the encryption/decryption
mode ("cbc" (default) or "ecb").
crypt.AES
objects have two methods: encrypt(data)
and decrypt(data)
.
crypt.BTEA(password) returns a BTEA codec
(a tiny cipher with reasonable security and efficiency,
see http://en.wikipedia.org/wiki/XXTEA).
password
is the encryption/decryption key (only the first 16 bytes are used).
crypt.BTEA
objects have two methods: encrypt(data)
and decrypt(data)
.
BTEA encrypts 32-bit words so the length of data should be a multiple of 4
(if not, BTEA will add null padding at the end of data).
crypt.RC4(password, drop) return a RC4 codec
(a popular stream cypher, see http://en.wikipedia.org/wiki/RC4).
password
is the encryption/decryption key.
drop
is the numbre of bytes ignores before encoding (768 by default).
crypt.RC4
returns the encryption/decryption function.
crypt.random(bits) returns a string with bits
random bits.
libcurl is multiprotocol file transfer library. This package is a simple Lua interface to libcurl.
This package is based on Lua-cURL and provides the same API plus a few higher level objects.
This package was introduced before socket
which is based on Lua Socket
.
I recommend using socket
instead of curl
.
curl.FTP(url [, login, password]) creates an FTP object to connect to
the FTP server at url
. login
and password
are optional.
Methods are:
-
cd(path)
changes the current working directory. No connection is made,path
is just stored internally for later connections. -
get(path)
retrievespath
. -
put(path, data)
sends and stores the stringdata
to the filepath
. -
rm(path)
deletes the filepath
. -
mkdir(path)
creates the directorypath
. -
rmdir(path)
deletes the directorypath
. -
list(path)
returns an iterator listing the directorypath
.
FTP connections are made through the cURL easy interface, each request is in fact an entire connection (and deconnection).
curl.HTTP(url) creates an HTTP object to connect to the HTTP server at url
.
Methods are:
-
get(path)
retrievespath
. -
save(path [, name])
retrievespath
and saves it toname
. The default value ofname
is the basename ofpath
.
fs.getcwd() returns the current working directory.
fs.chdir(path) changes the current directory to path
.
fs.listdir([path]) returns the list of files and directories in
path
(the default path is the current directory).
fs.dir([path]) returns an iterator listing files and directories in
path
(the default path is the current directory).
fs.walk([path]) returns an iterator listing directory and file names
in path
and its subdirectories (the default path is the current directory).
fs.mkdir(path) creates a new directory path
.
fs.rename(old_name, new_name) renames the file old_name
to new_name
.
fs.remove(name) deletes the file name
.
fs.copy(source_name, target_name) copies file source_name
to target_name
.
The attributes and times are preserved.
fs.stat(name) reads attributes of the file name
. Attributes are:
name
: name- type: "file" or "directory"
size
: size in bytesmtime
,atime
,ctime
: modification, access and creation times.mode
: file permissionsuR
,uW
,uX
: user Read/Write/eXecute permissionsgR
,gW
,gX
: group Read/Write/eXecute permissionsoR
,oW
,oX
: other Read/Write/eXecute permissions
fs.inode(name) reads device and inode attributes of the file name
.
Attributes are:
dev
,ino
: device and inode numbers
fs.chmod(name, other_file_name) sets file name
permissions as
file other_file_name
(string containing the name of another file).
fs.chmod(name, bit1, ..., bitn) sets file name
permissions as
bit1
or ... or bitn
(integers).
fs.touch(name) sets the access time and the modification time of file name
with the current time.
fs.touch(name, number) sets the access time and the modification time of file name
with number
.
fs.touch(name, other_name) sets the access time and the modification time of file name
with the times of file other_name
.
fs.basename(path) return the last component of path.
fs.dirname(path) return all but the last component of path.
fs.absname(path) return the absolute path name of path.
fs.sep is the directory separator (/ or \).
fs.uR, fs.uW, fs.uX are the User Read/Write/eXecute mask for fs.chmod
.
fs.gR, fs.gW, fs.gX are the Group Read/Write/eXecute mask for fs.chmod
.
fs.oR, fs.oW, fs.oX are the Other Read/Write/eXecute mask for fs.chmod
.
fs.aR, fs.aW, fs.aX are All Read/Write/eXecute mask for fs.chmod
.
Bonaluna parsing library is Lpeg. Both lpeg and re modules are loaded when Bonaluna is started.
The documentation of these modules are available on Lpeg web site:
Compression libraries are based on:
It's inspired by the Lua Lzo module.
Future versions of BonaLuna may remove or add some compression library.
Currently, only LZ4 is used in the default BonaLuna distribution
but you can change it in setup
.
z.compress(data) compresses data
using the best compressor and returns the compressed string.
z.decompress(data) decompresses data
and returns the decompressed string.
minilzo.compress(data) compresses data
with miniLZO and returns the compressed string.
minilzo.decompress(data) decompresses data
with miniLZO and returns the decompressed string.
lzo.compress(data) compresses data
with LZO and returns the compressed string.
lzo.decompress(data) decompresses data
with LZO and returns the decompressed string.
qlz.compress(data) compresses data
with QLZ and returns the compressed string.
qlz.decompress(data) decompresses data
with QLZ and returns the decompressed string.
lz4.compress(data) compresses data
with LZ4 and returns the compressed string.
lz4.decompress(data) decompresses data
with LZ4 and returns the decompressed string.
lz4hc.compress(data) compresses data
with LZ4HC and returns the compressed string.
lz4hc.decompress(data) decompresses data
with LZ4HC and returns the decompressed string.
lzf.compress(data) compresses data
with LZF and returns the compressed string.
lzf.decompress(data) decompresses data
with LZF and returns the decompressed string.
zlib.compress(data) compresses data
with ZLIB and returns the compressed string.
zlib.decompress(data) decompresses data
with ZLIB and returns the decompressed string.
ucl.compress(data) compresses data
with UCL and returns the compressed string.
ucl.decompress(data) decompresses data
with UCL and returns the decompressed string.
lzma.compress(data) compresses data
with XZ Utils and returns the compressed string.
lzma.decompress(data) decompresses data
with XZ Utils and returns the decompressed string.
ps.sleep(n) sleeps for n
seconds.
The rl (readline) package was initially inspired by ilua and adapted for BonaLuna.
rl.read(prompt) prints prompt
and returns the string entered by the user.
rl.add(line) adds line
to the readline history (Linux only).
The ser package is written by Robin Wellner (https://github.com/gvx/Ser) and integrated in BonaLuna in two functions:
ser.serialize(table) returns a string that can be evaluated to build
the initial table
.
ser.deserialize(src) evaluates src
and returns a table.
BonaLuna adds a few functions to the builtin string module:
string.split(s, sep, maxsplit, plain) splits s
using sep
as a separator.
If plain
is true, the separator is considered as plain text.
maxsplit
is the maximum number of separators to find (ie the remaining string is returned unsplit.
This function returns a list of strings.
string.gsplit(s, sep, maxsplit, plain) splits the string as string.split
but returns an iterator.
string.lines(s) splits s
using '\n' as a separator and returns an iterator.
string.ltrim(s), string.rtrim(s), string.trim(s) remove left/right/both end spaces
The socket package is based on Lua Socket and adapted for BonaLuna.
The documentation of Lua Socket
is available at the Lua Socket documentation web site.
This package also comes with the following functions.
FTP(url [, login, password]) creates an FTP object to connect to
the FTP server at url
. login
and password
are optional.
Methods are:
-
cd(path)
changes the current working directory. -
pwd()
returns the current working directory. -
get(path)
retrievespath
. -
put(path, data)
sends and stores the stringdata
to the filepath
. -
rm(path)
deletes the filepath
. -
mkdir(path)
creates the directorypath
. -
rmdir(path)
deletes the directorypath
. -
list(path)
returns an iterator listing the directorypath
.
This package was redundant with string.pack
and string.unpack
since Lua 5.3.
It has been removed.
One can add struct = string
to make old scripts compatible.
Some formats are different (s
becomes z
, c0
doesn't exist).
The struct package was taken from Library for Converting Data to and from C Structs for Lua 5.1 and adapted for BonaLuna.
sys.hostname() returns the host name.
sys.domainname() returns the domain name.
sys.hostid() returns the host id.
sys.platform is "Linux"
or "Windows"
It is possible to add scripts to the BonaLuna interpretor to make a single executable file containing the interpretor and some BonaLuna scripts.
This feature is inspired by srlua.
compile:on|off|min turns compilation on, off or on when chunks are smaller than sources (min
is the default value)
compress:on|off|min turns compression on, off or on when chunks are smaller than sources (min
is the default value)
read:original_interpretor reads the initial interpretor
lua:script.lua adds a script to be executed at runtime
lua:script.lua=realname.lua as above but stored under a different name
str:name=value creates a global variable holding a string
str:name=@filename as above but the string is the content of a file
file:name adds a file to be created at runtime (the file is not overwritten if it already exists)
file:name=realname as above but stored under a different name
dir:name creates a directory at runtime
write:new_executable write a new executable containing the original interpretor and all the added items
When a path starts with :
, it is relative to the executable path otherwise
it is relative to the current working directory.
The class Pegar
defines methods to build an executable.
The methods have the same name as the command line parameters:
compile(mode) turns compilation on, off or on
compress(mode) turns compression on, off or on
read(original_interpretor) reads the initial interpretor (if different from the running interpretor)
lua(script[, realname]) adds a script to be executed at runtime
str(name, value) creates a global variable holding a string
strf(name, filename) as above but the string is the content of a file
file(name[, realname]) adds a file to be created at runtime
dir(name) creates a directory at runtime
write(new_executable) write a new executable containing the original interpretor and all the added items
Some external modules are available.
- Lupy: A small Python-style OO implementation
- Tasks: TCP DNS proxy which can get the RIGHT IP address. It includes a multi tasking package
This documentation has been generated by a BonaLuna script. bonaluna.lua also contains some tests.