wiki/articles/lua.md

79 lines
2.7 KiB
Markdown

# Lua
[Lua](https://lua.org) is a libre, dynamic scripting programming language created in 1993 by the Brazilian programmer Roberto Ierusalimschy.
Lua is notable for its efficiency (faster than [Python](python.md)), minimal features, extensibility and a small,
non bloated implementation, making it a excellent choice for embedding into programs.
Lua has only has 5 datatypes: numbers, tables, functions, strings and `nil`. Tables are specially important in Lua,
implementing arrays and hash tables in a single type and enabling metaprogramming though the use of metamethods and metatables.
The main reference implementation is written in [ANSI C](c.md) (about 32000 LOC) and uses a register-based bytecode virtual machine for execution.
Another notable implementation is [LuaJIT](https://luajit.org), which speeds up execution speed by JIT compiling the Lua code.
## Bytecode
`luac` can be used to compile and dump bytecode into a file. However the bytecode is not portable.
```sh
luac -o out source.lua
```
You can get a listing of the compiled bytecode for a Lua source file with `luac`:
```sh
luac -p -l -l source.lua
```
See the article [Bytecode](bytecode.md) for an annotated example of Lua bytecode.
## Examples
### Hello world
```lua
print('Hello, world!') -- Can also use double quotes
-- Lua allows you to skip the parentheses if a single argument is supplied:
print 'Hello, world!'
-- Raw string literal:
print [[Hello, world!]]
```
### Factorial
#### Iterative
```lua
function fact(n)
local res = 1
for i = 1, n do
-- Lua has no operator-assignment operators
res = res * i
end
return res
end
-- Functions and variables are global by default, use the `local`
-- specifier to make them local.
local n = 16
-- `..` is the string concatenation operator
print('Factorial of ' .. n .. ':', fact(n))
```
#### Tail recursive
```lua
function fact(n, acc)
-- Unsupplied arguments default to a `nil` value
-- With the `or` operator we can emulate default arguments:
acc = acc or 1
if n == 0 then
return acc
end
return fact(n - 1, acc * n)
end
```
## Resources
- [Documentation and Reference](https:/articles//lua.org/docs.html)
- [Lua Programming Gems](https://lua.org/gems)
- [Online Lua bytecode explorer](https://www.luac.nl)
- [lua-users](https://www.lua-users.org/) Unofficial Lua Users group, has a wiki about Lua with useful resources.
- [The Implementation of Lua 5.0](https://www.lua.org/doc/jucs05.pdf): paper that describes the register-based virtual machine
introduced in version 5.0.
- [Lua 5.3 Bytecode Reference](https://the-ravi-programming-language.readthedocs.io/en/latest/lua_bytecode_reference.html) (archive: <https://archive.is/yLSvT>)
## See also
- [Teal](https://github.com/teal-language/tl) a Lua dialect that adds static typing