REXX · Fundamentos
Controle de Fluxo — IF, SELECT e Loops em REXX
18 min de leitura
Nível: Iniciante
Com variáveis e operadores dominados, é hora de controlar o fluxo do seu exec. O REXX tem estruturas de controle simples e expressivas: IF/THEN/ELSE para decisões, SELECT/WHEN para múltiplas opções e DO para loops. A sintaxe é mais próxima do inglês do que do COBOL — e bem mais legível.
1. IF / THEN / ELSE
A estrutura IF do REXX exige THEN na mesma linha e usa DO...END para blocos com múltiplas instruções:
/* Forma simples — uma instrução no THEN */
IF IDADE >= 18 THEN SAY 'Maior de idade'
/* Forma com bloco */
IF SALARIO > 5000 THEN DO
DESCONTO = SALARIO * 0.275
SAY 'Desconto aplicado:' DESCONTO
END
ELSE DO
DESCONTO = SALARIO * 0.075
SAY 'Desconto reduzido:' DESCONTO
END
/* IF aninhado */
IF TIPO = 'A' THEN
SAY 'Tipo A'
ELSE IF TIPO = 'B' THEN
SAY 'Tipo B'
ELSE
SAY 'Tipo desconhecido'
💡 THEN deve estar na mesma linha que IF
No REXX, IF condição e THEN precisam estar na mesma linha lógica. Se você precisar quebrar a linha por extensão, use a continuação com vírgula: IF A > 0 & , (a vírgula no final indica continuação). Sem isso, o REXX lê o THEN na linha seguinte como instrução separada e gera erro.
2. SELECT / WHEN / OTHERWISE
O SELECT é o equivalente de um switch/case — avalia uma sequência de condições e executa o primeiro bloco verdadeiro. Mais limpo que IFs aninhados quando há muitas opções:
SELECT
WHEN OPCAO = '1' THEN SAY 'Cadastrar cliente'
WHEN OPCAO = '2' THEN SAY 'Consultar cliente'
WHEN OPCAO = '3' THEN DO
SAY 'Excluir cliente'
SAY 'Confirme: S/N?'
PULL CONF
END
WHEN OPCAO = 'X' THEN EXIT 0
OTHERWISE DO
SAY 'Opção inválida'
EXIT 8
END
END /* SELECT */
🦕 Analogia — SELECT como EVALUATE do COBOL
O SELECT/WHEN do REXX é o equivalente direto do EVALUATE/WHEN do COBOL. A diferença é que no REXX cada WHEN pode ter uma condição completamente independente — não precisa comparar com a mesma variável. WHEN A > 0 e WHEN B = 'X' podem coexistir no mesmo SELECT.
3. DO i = 1 TO n — loop contado
O loop contado executa um bloco um número fixo de vezes, incrementando uma variável a cada iteração:
/* Loop simples de 1 a 10 */
DO I = 1 TO 10
SAY 'Linha número:' I
END
/* Loop com passo diferente de 1 */
DO I = 0 TO 100 BY 10
SAY I
END
/* Saída: 0 10 20 30 40 50 60 70 80 90 100 */
/* Loop decrescente */
DO I = 5 TO 1 BY -1
SAY I
END
/* Saída: 5 4 3 2 1 */
4. DO WHILE e DO UNTIL
DO WHILE executa enquanto a condição for verdadeira (testa antes de cada iteração). DO UNTIL executa até a condição ser verdadeira (testa depois de cada iteração — executa pelo menos uma vez):
/* DO WHILE — pode nunca executar */
CONTADOR = 1
DO WHILE CONTADOR <= 5
SAY 'Contagem:' CONTADOR
CONTADOR = CONTADOR + 1
END
/* DO UNTIL — executa pelo menos uma vez */
DO UNTIL RESPOSTA = 'S' | RESPOSTA = 'N'
SAY 'Confirma? (S/N)'
PULL RESPOSTA
END
5. DO FOREVER, ITERATE e LEAVE
DO FOREVER cria um loop infinito — útil para menus que devem continuar até o usuário escolher sair. LEAVE sai do loop imediatamente. ITERATE pula para a próxima iteração (equivalente ao continue em outras linguagens):
/* Loop de menu que termina apenas com opção X */
DO FOREVER
SAY ''
SAY '1-Listar 2-Criar 3-Deletar X-Sair'
PULL OPCAO
IF OPCAO = 'X' THEN LEAVE /* sai do DO FOREVER */
IF OPCAO = '' THEN ITERATE /* entrada vazia — volta ao início */
CALL ProcessarOpcao OPCAO
END
SAY 'Até logo!'
EXIT 0
/* ITERATE em loop contado — pular números pares */
DO I = 1 TO 10
IF I // 2 = 0 THEN ITERATE /* par — pula */
SAY I /* imprime só ímpares: 1 3 5 7 9 */
END
6. Exemplo completo — menu interativo
Juntando tudo: um exec com menu, validação de entrada e saída limpa:
/* REXX - Menu de gerenciamento de datasets */
ARG PREFIXO
IF PREFIXO = '' THEN PREFIXO = 'USUARIO'
DO FOREVER
SAY ''
SAY '=== Gerenciador de Datasets ['PREFIXO'] ==='
SAY ' 1 - Listar datasets'
SAY ' 2 - Ver informações de dataset'
SAY ' X - Sair'
SAY ''
SAY 'Opção ==>'
PULL OPCAO
SELECT
WHEN OPCAO = '1' THEN
ADDRESS TSO 'LISTCAT LEVEL('''PREFIXO''') NAME'
WHEN OPCAO = '2' THEN DO
SAY 'Nome do dataset?'
PULL DSN
ADDRESS TSO 'LISTDS '''DSN''' '
END
WHEN OPCAO = 'X' THEN LEAVE
OTHERWISE SAY 'Opção inválida. Tente novamente.'
END /* SELECT */
END /* DO FOREVER */
SAY 'Encerrando. Até logo!'
EXIT 0