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