Este repositório tem como alvo o PUC-Lua 5.4. Fora daqui você vai esbarrar em muito código 5.1 e em LuaJIT, que implementa a linguagem 5.1 com extensões. Este guia mapeia o que muda de verdade ao transitar entre versões — não é uma enciclopédia, é o mínimo para não se machucar.
setfenv/getfenv saem: ambientes viram a variável
_ENV. O unpack global vira table.unpack. Chegam goto e os
rótulos ::nome::. xpcall passa a aceitar argumentos extras.math.type), divisão inteira // e overflow com wraparound.
Operadores bit a bit nativos (&, |, ~, <<, >>) substituem a
biblioteca bit32 que existiu só na 5.2. Chegam string.pack/
string.unpack e a biblioteca utf8.<const> e <close> (variáveis
to-be-closed), GC geracional e math.random já semeado
automaticamente na partida.| Recurso | 5.1 | 5.2 | 5.3 | 5.4 | LuaJIT |
|---|---|---|---|---|---|
unpack |
global | table.unpack |
table.unpack |
table.unpack |
global¹ |
| Ambientes | setfenv/getfenv |
_ENV |
_ENV |
_ENV |
setfenv/getfenv |
| Inteiros nativos | — (só float) | — | sim | sim | — (float; int64 via FFI) |
| Bit a bit | — | bit32 |
operadores nativos | operadores nativos | biblioteca bit |
goto / rótulos |
— | sim | sim | sim | sim (extensão) |
// divisão inteira |
— | — | sim | sim | — |
string.pack/unpack |
— | — | sim | sim | — |
Biblioteca utf8 |
— | — | sim | sim | — |
<const> / <close> |
— | — | — | sim | — |
| GC geracional | — | experimental | — | sim | GC próprio |
¹ LuaJIT compilado com LUAJIT_ENABLE_LUA52COMPAT ganha parte da 5.2
(table.unpack, goto já é padrão, entre outros).
bit.table.unpack → unpack. Idioma portátil:
local unpack = table.unpack or unpack.math.type nem subtipo integer — todo número é
float (double). 7 // 2 nem compila: use math.floor(7 / 2).&, |, <<…) não compilam: use
bit.band, bit.bor, bit.lshift (LuaJIT) ou bit32 (PUC 5.2).<const> e <close> não compilam: remova o atributo e feche
recursos explicitamente em TODOS os caminhos (o padrão pré-5.4 de
pcall + close).string.pack/string.unpack/packsize não existem: no LuaJIT a
FFI cobre o caso; em PUC 5.1/5.2, bibliotecas externas (lua-struct).utf8 não existe: só bibliotecas externas — e valem em
dobro os avisos de bytes × caracteres de basico/cadeias_de_texto.lua.goto funciona no LuaJIT (extensão), mas não no PUC-Lua 5.1._ENV na 5.1, o idioma é setfenv.Dica final: para código que precisa rodar nos dois mundos, mire o
subconjunto 5.1 mais o idioma table.unpack or unpack — é o que fazem
as bibliotecas portáveis do ecossistema.