@designliquido/delegua
Version:
Linguagem de programação simples e moderna usando português estruturado.
216 lines • 8.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = carregarBibliotecaGlobalPrisma;
const estruturas_1 = require("../../../interpretador/estruturas");
/**
* Carrega as funções nativas (embutidos) do dialeto Prisma na pilha de escopos.
* Funções implementadas conforme o manual de Linguagem Prisma.
*
* @param interpretador - O interpretador em execução.
* @param globals - Pilha de escopos de execução para registrar variáveis globais.
*/
function carregarBibliotecaGlobalPrisma(interpretador, globals) {
/**
* `tipo(x)` - Retorna o tipo de um valor como texto.
* Tipos suportados: "número", "texto", "tabela", "funcao", "logico", "nulo", "userdata"
*/
globals.definirVariavel('tipo', new estruturas_1.FuncaoPadrao(1, function (_, valor) {
const v = valor !== null && valor !== undefined && valor.hasOwnProperty('valor')
? valor.valor
: valor;
if (v === null || v === undefined) {
return 'nulo';
}
if (typeof v === 'number') {
return 'número';
}
if (typeof v === 'string') {
return 'texto';
}
if (typeof v === 'boolean') {
return 'logico';
}
if (v instanceof estruturas_1.Chamavel || typeof v.chamar === 'function') {
return 'funcao';
}
if (Array.isArray(v) || (typeof v === 'object' && v !== null)) {
return 'tabela';
}
// Fallback para tipos desconhecidos
return typeof v;
}));
/**
* `poe(...)` - Imprime os argumentos na saída. Alias para escreva/imprima.
* Aceita múltiplos argumentos.
*/
globals.definirVariavel('poe', new estruturas_1.FuncaoPadrao(1, function (_visitante, ...args) {
for (const arg of args) {
const v = arg !== null && arg !== undefined && arg.hasOwnProperty('valor')
? arg.valor
: arg;
const texto = v !== null && v !== undefined ? String(v) : 'nulo';
interpretador.funcaoDeRetorno(texto);
}
}));
/**
* `pares(tabela)` - Retorna um iterador sobre os pares (chave, valor) de uma tabela.
* Itera apenas sobre índices pares (0, 2, 4, ...).
*/
globals.definirVariavel('pares', new estruturas_1.FuncaoPadrao(1, function (interp, tabela) {
const t = tabela !== null && tabela !== undefined ? interp.resolverValor(tabela) : null;
const resultado = [];
if (Array.isArray(t)) {
for (let i = 0; i < t.length; i += 2) {
resultado.push([i, t[i]]);
}
}
else if (typeof t === 'object' && t !== null) {
const valores = Object.values(t);
for (let i = 0; i < valores.length; i += 2) {
resultado.push([i, valores[i]]);
}
}
return resultado;
}));
/**
* `ipares(tabela)` - Retorna um iterador sobre os pares (chave, valor) de uma tabela.
* Itera apenas sobre índices ímpares (1, 3, 5, ...).
*/
globals.definirVariavel('ipares', new estruturas_1.FuncaoPadrao(1, function (interp, tabela) {
const t = tabela !== null && tabela !== undefined ? interp.resolverValor(tabela) : null;
const resultado = [];
if (Array.isArray(t)) {
for (let i = 1; i < t.length; i += 2) {
resultado.push([i, t[i]]);
}
}
else if (typeof t === 'object' && t !== null) {
const valores = Object.values(t);
for (let i = 1; i < valores.length; i += 2) {
resultado.push([i, valores[i]]);
}
}
return resultado;
}));
/**
* `convnumero(x)` - Converte um valor para número.
* Se a conversão não for possível, retorna nulo ou lança um erro.
*/
globals.definirVariavel('convnumero', new estruturas_1.FuncaoPadrao(1, function (_, valor) {
const v = valor !== null && valor !== undefined && valor.hasOwnProperty('valor')
? valor.valor
: valor;
if (typeof v === 'number') {
return v;
}
if (typeof v === 'string') {
const num = parseFloat(v);
return isNaN(num) ? null : num;
}
if (typeof v === 'boolean') {
return v ? 1 : 0;
}
return null;
}));
/**
* `convstring(x)` - Converte um valor para texto.
* Qualquer valor é convertível em texto.
*/
globals.definirVariavel('convstring', new estruturas_1.FuncaoPadrao(1, function (_, valor) {
const v = valor !== null && valor !== undefined && valor.hasOwnProperty('valor')
? valor.valor
: valor;
if (v === null || v === undefined) {
return 'nulo';
}
if (typeof v === 'boolean') {
return v ? 'verdadeiro' : 'falso';
}
return String(v);
}));
/**
* `tamanho(x)` - Retorna o tamanho de um vetor ou comprimento de uma string.
*/
globals.definirVariavel('tamanho', new estruturas_1.FuncaoPadrao(1, function (_, valor) {
const v = valor !== null && valor !== undefined && valor.hasOwnProperty('valor')
? valor.valor
: valor;
if (Array.isArray(v)) {
return v.length;
}
if (typeof v === 'string') {
return v.length;
}
if (typeof v === 'object' && v !== null) {
return Object.keys(v).length;
}
return 0;
}));
/**
* `piso(n)` - Retorna o maior inteiro menor ou igual a `n` (equivalente a `math.floor` em Lua).
*/
globals.definirVariavel('piso', new estruturas_1.FuncaoPadrao(1, function (_, n) {
const val = n !== null && n !== undefined && n.hasOwnProperty('valor') ? n.valor : n;
if (typeof val !== 'number')
return null;
return Math.floor(val);
}));
/**
* `teto(n)` - Retorna o menor inteiro maior ou igual a `n` (equivalente a `math.ceil` em Lua).
*/
globals.definirVariavel('teto', new estruturas_1.FuncaoPadrao(1, function (_, n) {
const val = n !== null && n !== undefined && n.hasOwnProperty('valor') ? n.valor : n;
if (typeof val !== 'number')
return null;
return Math.ceil(val);
}));
/**
* `aleatorio()` - Retorna um número aleatório entre 0 e 1.
*/
globals.definirVariavel('aleatorio', new estruturas_1.FuncaoPadrao(0, function (_) {
return Math.random();
}));
/**
* `aleatorio_entre(min, max)` - Retorna um número aleatório entre min (inclusive) e max (exclusivo).
*/
globals.definirVariavel('aleatorio_entre', new estruturas_1.FuncaoPadrao(2, function (_, min, max) {
const minVal = min !== null && min !== undefined && min.hasOwnProperty('valor') ? min.valor : min;
const maxVal = max !== null && max !== undefined && max.hasOwnProperty('valor') ? max.valor : max;
if (typeof minVal !== 'number' || typeof maxVal !== 'number') {
return null;
}
return Math.floor(Math.random() * (maxVal - minVal)) + minVal;
}));
/**
* `coletelixo(acao?)` - Controla o coletor de lixo (equivalente a `collectgarbage` em Lua).
* Ações suportadas:
* "coletar" (padrão) - solicita um ciclo de coleta; retorna 0.
* "contar" - retorna o uso de memória em KB (sempre 0 em JS).
* "parar" - para o coletor; no-op em JS; retorna 0.
* "reiniciar" - reinicia o coletor; no-op em JS; retorna 0.
* "rodando" - retorna verdadeiro se o coletor está ativo.
* "passo" - executa um passo de coleta; no-op em JS; retorna 0.
* Qualquer outra ação retorna nulo.
*/
globals.definirVariavel('coletelixo', new estruturas_1.FuncaoPadrao(1, function (_, acao) {
const acaoVal = acao !== null && acao !== undefined && acao.hasOwnProperty('valor')
? acao.valor
: acao;
const acaoStr = typeof acaoVal === 'string' ? acaoVal : 'coletar';
if (acaoStr === 'rodando') {
return true;
}
if (acaoStr === 'contar') {
return 0;
}
if (['coletar', 'parar', 'reiniciar', 'passo'].includes(acaoStr)) {
// Solicita GC ao V8 se disponível (requer --expose-gc)
if (typeof globalThis.gc === 'function') {
globalThis.gc();
}
return 0;
}
return null;
}));
}
//# sourceMappingURL=biblioteca-global.js.map