| Bellacosa Mainframe apresenta o compound variables data stack no REXX |
🔥 REXX: O “JSON DO MAINFRAME” ANTES DO JSON EXISTIR!
Compound Variables, Data Stack e os Superpoderes Secretos do TSO/E 🚀
“Enquanto muita gente acha que o mainframe era limitado nos anos 80… o REXX já fazia coisas que linguagens modernas demorariam décadas para popularizar.”
— Bellacosa Mainframe ☕💻
☕ Introdução — O Dia em que Descobri que o REXX Era MUITO Mais Moderno do que Parecia
Existe um momento na vida de todo programador mainframe em que ele percebe:
“Espera… isso aqui parece um Python disfarçado de terminal verde.”
E normalmente esse momento acontece quando ele aprende:
- Compound Variables
- OUTTRAP()
- Data Stack
Porque aqui o REXX deixa de ser apenas:
“uma linguagemzinha de automação”
…e começa a revelar algo assustadoramente avançado.
Sim…
O REXX já possuía:
✅ Estruturas associativas
✅ Chaves dinâmicas
✅ Captura de stdout
✅ Filas e pilhas
✅ Estruturas pseudo-JSON
✅ Automação textual inteligente
…quando muita linguagem moderna ainda nem existia.
🧠 O “Pseudo-JSON” do Mainframe
Veja isto:
cliente.100.nome = "VAGNER"
cliente.100.cidade = "ITATIBA"
cliente.100.cargo = "MAINFRAME SPECIALIST"
Agora compare com JSON moderno:
{
"cliente": {
"100": {
"nome": "VAGNER",
"cidade": "ITATIBA",
"cargo": "MAINFRAME SPECIALIST"
}
}
}
😳
Percebe o absurdo?
O REXX fazia isso décadas antes do JSON virar padrão mundial.
🔥 Compound Variables — O Recurso que Quase Ninguém Explora Direito
As famosas:
Stem Variables
Estrutura:
stem.tail
Exemplo:
usuario.nome
Onde:
| Parte | Significado |
|---|---|
| usuario. | stem |
| nome | tail |
☠️ O Detalhe que Destrói Iniciantes
ISTO:
cliente
NÃO É IGUAL A:
cliente.
O ponto muda tudo.
🤯 O Stem Possui “Efeito Mágico”
Exemplo:
status. = "DESCONHECIDO"
Agora:
SAY status.job1
SAY status.job2
SAY status.qualquercoisa
Resultado:
DESCONHECIDO
DESCONHECIDO
DESCONHECIDO
Mesmo sem criar as variáveis individualmente.
🧙♂️ O Feitiço do Tail Dinâmico
Aqui o REXX começa a parecer bruxaria.
dia.1 = "SEG"
dia.2 = "TER"
dia.3 = "QUA"
x = 2
SAY dia.x
O interpretador resolve:
dia.2
Saída:
TER
⚡ Isso Era Um “HashMap” Antes do Java
Hoje faríamos:
Python
dias[x]
JavaScript
dias[x]
REXX (1980s 😎)
dia.x
☕ Easter Egg #1 — O “Banco de Dados” em REXX
Você pode montar estruturas absurdamente sofisticadas:
produto.100.desc = "CAFÉ"
produto.100.preco = 15.90
produto.200.desc = "COBOL"
produto.200.preco = 9999.99
Consulta:
id = 200
SAY produto.id.desc
Resultado:
COBOL
Sim…
Você acabou de criar um mini banco key-value.
💣 OUTTRAP() — O Recurso que Faz Operadores Virarem Semideuses
Pouca gente entende o quão poderoso isso é.
O OUTTRAP captura saída textual de comandos TSO.
😳 O Terminal Vira Dados
Exemplo:
x = OUTTRAP("lista.")
"LISTALC STATUS"
x = OUTTRAP("OFF")
Agora:
lista.1
lista.2
lista.3
contêm TODA a saída do comando.
🚀 Isso é o Equivalente Mainframe de:
Linux
comando > arquivo
Python
subprocess.capture_output()
PowerShell
$result = command
Mas no TSO/E…
isso existia há MUITO tempo.
☕ Easter Egg #2 — O Parser Automático de LISTCAT
x = OUTTRAP("cat.")
"LISTCAT ENT(PROD.CLIENTES)"
x = OUTTRAP("OFF")
DO i = 1 TO cat.0
IF POS("TRACKS",cat.i) > 0 THEN
SAY "ALOCACAO:" cat.i
END
😎
O operador vira praticamente um “detetive do catálogo”.
🧨 A Data Stack — O Recurso Mais Perigoso do REXX
Aqui começam os poderes obscuros do TSO/E.
A Data Stack é:
uma pilha/fila dinâmica global
PUSH vs QUEUE
PUSH
PUSH "A"
PUSH "B"
Saída via PARSE PULL:
B
A
LIFO.
QUEUE
QUEUE "A"
QUEUE "B"
Saída:
A
B
FIFO.
🎮 Analogia Gamer
| Comando | Analogia |
|---|---|
| PUSH | pilha de inventário |
| QUEUE | fila de matchmaking |
☠️ O Erro Mais Mortal do REXX
Se você terminar um exec deixando dados na stack…
…esses dados podem virar comandos TSO.
Sim.
COMANDOS.
😨 Exemplo de Filme de Terror Mainframe
QUEUE "DELETE PROD.CLIENTES"
EXIT
Se cair na stack errada…
adeus dataset.
🛡️ A Defesa dos Jedi Mainframers — NEWSTACK
Profissionais experientes SEMPRE usam:
ADDRESS TSO "NEWSTACK"
e depois:
ADDRESS TSO "DELSTACK"
☕ Easter Egg #3 — O “Sandbox” do REXX
O NEWSTACK funciona quase como:
- container
- sandbox
- ambiente isolado
Décadas antes de Docker existir.
😎
🧠 O QUEUED() Salva Vidas
Antes de:
PARSE PULL linha
Faça:
IF QUEUED() > 0 THEN
PARSE PULL linha
Porque se stack estiver vazia…
o REXX tenta ler do terminal.
Em batch isso pode causar:
HANG
WAIT
ABEND OPERACIONAL
OPERADOR EM PÂNICO
🤯 MAKEBUF — O Recurso Ninja que Quase Ninguém Conhece
Sim…
o stack possui buffers internos.
ADDRESS TSO "MAKEBUF"
Pouquíssimos profissionais modernos usam isso.
Mas no passado…
isso era arma secreta de automações ISPF sofisticadas.
🚀 Exemplo Profissional Completo
Scanner Automático de Catálogo
/*-----------------------------------*/
/* BELLACOSA MAINFRAME SCANNER */
/*-----------------------------------*/
ADDRESS TSO "NEWSTACK"
x = OUTTRAP("ds.")
"LISTCAT LEVEL(PROD)"
x = OUTTRAP("OFF")
DO i = 1 TO ds.0
linha = ds.i
IF POS("NONVSAM",linha) > 0 THEN
SAY "DATASET ENCONTRADO:"
SAY linha
SAY "---------------------"
END
ADDRESS TSO "DELSTACK"
EXIT
☕ Easter Egg #4 — O “Python Invisível” do z/OS
Muita gente usa Python hoje para:
- parse textual
- automação
- captura de comandos
Mas o TSO/E + REXX já fazia isso muito antes.
📜 Filosofia do REXX
O REXX foi criado para:
✅ produtividade
✅ legibilidade
✅ automação
✅ integração
✅ simplicidade
Por isso ele parece:
- elegante
- textual
- flexível
- “humano”
🤖 O Mainframe Era MUITO Mais Moderno do que Parecia
Quando alguém disser:
“mainframe é ultrapassado”
Mostre:
- compound variables
- OUTTRAP
- stacks dinâmicas
- parsing inteligente
E depois pergunte:
“Seu framework moderno faz isso tudo tão elegantemente?”
😏
☕ Conclusão — O Verdadeiro Poder do REXX
REXX nunca foi apenas “uma linguagem de scripts”.
Ele era:
um canivete suíço de automação textual corporativa
E quando combinamos:
- Compound Variables
- OUTTRAP()
- Data Stack
…o TSO/E praticamente ganha superpoderes.
🚀 Bellacosa Mainframe Insight
“O REXX não envelheceu.
Apenas ficou escondido enquanto o resto do mundo reinventava suas ideias.” ☕💻