1. Variáveis — atribuição e tipagem implícita

Em REXX, você atribui um valor a uma variável simplesmente escrevendo nome = valor. Não há declaração prévia, não há tipo fixo:

/* REXX */ NOME = 'Maria Santos' /* string */ IDADE = 30 /* número */ SALARIO = 4500.50 /* decimal */ SAY NOME 'tem' IDADE 'anos' /* Saída: Maria Santos tem 30 anos */ SAY IDADE + 5 /* Saída: 35 (REXX converte a string '30' para número automaticamente) */

Uma variável não inicializada tem como valor seu próprio nome em maiúsculo. Isso é importante saber para evitar bugs silenciosos:

SAY MINHAVARIAVELNAODEFINIDA /* Saída: MINHAVARIAVELNAODEFINIDA (não é erro, é o próprio nome!) */ SAY CONTADOR + 1 /* Erro! REXX tenta somar 'CONTADOR' (string) com 1 — não é número */

⚠️ Variável não inicializada vale seu próprio nome

Este é o comportamento mais surpreendente do REXX para quem vem de outras linguagens. Se você escreve SAY X sem ter atribuído nada a X, o resultado é a string X, não um erro. Isso mascara typos — se você escrever COUNTR em vez de COUNTER, o REXX não reclama.

2. Operadores aritméticos

OperadorOperaçãoExemploResultado
+Adição10 + 313
-Subtração10 - 37
*Multiplicação10 * 330
/Divisão10 / 33.33333...
%Divisão inteira10 % 33
//Resto (módulo)10 // 31
**Potência2 ** 8256
/* REXX */ TOTAL = 150 DESCONTO = 0.10 LIQUIDO = TOTAL - (TOTAL * DESCONTO) SAY 'Valor líquido:' LIQUIDO /* Saída: Valor líquido: 135 */ SAY 17 // 5 /* Saída: 2 (resto de 17/5) */ SAY 17 % 5 /* Saída: 3 (quociente inteiro) */

3. Operadores de string — concatenação

O REXX oferece três formas de concatenar strings:

NOME = 'Maria' SOBRENOME = 'Santos' /* 1. Espaço entre tokens — adiciona um espaço */ SAY NOME SOBRENOME /* Saída: Maria Santos */ /* 2. Operador || — concatena sem espaço */ SAY NOME||SOBRENOME /* Saída: MariaSantos */ /* 3. Adjacência (sem espaço nem ||) — concatena diretamente */ SAY NOME'!' /* Saída: Maria! */

🦕 Analogia — concatenação por espaço

No REXX, colocar dois tokens lado a lado com espaço entre eles já concatena com um espaço. É como se cada token fosse uma palavra numa frase — o REXX junta tudo naturalmente. Isso torna o SAY especialmente conveniente: SAY 'Olá,' NOME 'você tem' IDADE 'anos' produz uma frase bem formatada sem precisar de ||.

4. Operadores de comparação

OperadorSignificadoAlternativa
=Igual== (estrito)
\=Diferente\== (estrito) / <>
<Menor que
>Maior que
<=Menor ou igual
>=Maior ou igual

A diferença entre = e == é importante: = ignora espaços à esquerda e direita e compara numericamente quando possível. == compara byte a byte, exigindo correspondência exata:

SAY (' 5 ' = '5') /* Saída: 1 (true) — ignora espaços */ SAY (' 5 ' == '5') /* Saída: 0 (false) — espaços importam */ SAY ('10' > '9' ) /* Saída: 1 (true) — comparação numérica */ SAY ('10' >> '9' ) /* Saída: 0 (false) — comparação de string: '1' < '9' */

💡 Operadores lógicos

Para combinar condições, use & (AND), | (OR) e \ (NOT). Exemplo: IF A > 0 & B > 0 THEN SAY 'ambos positivos'. O REXX representa true como 1 e false como 0.

5. SAY e PULL — output e input

SAY exibe uma linha de texto. PULL lê uma linha do terminal (ou SYSTSIN em batch) e armazena em uma variável, convertendo para maiúsculo:

/* REXX - interação com usuário */ SAY 'Qual é o seu nome?' PULL NOME SAY 'Olá,' NOME'! Bem-vindo ao mainframe.'

💡 PULL converte para maiúsculo — use PARSE PULL para preservar

PULL é um atalho para PARSE UPPER PULL — ele converte o que o usuário digitou para maiúsculo antes de armazenar. Se você precisa preservar a capitalização original (ex.: para senhas ou nomes de arquivo), use PARSE PULL VARIAVEL em vez de PULL VARIAVEL.

6. ARG — recebendo parâmetros

Quando um exec é chamado com parâmetros (EXEC MEUEXEC PARAM1 PARAM2), o ARG captura esses valores. Assim como PULL, ARG converte para maiúsculo:

/* REXX - exec que recebe parâmetros */ ARG DATASET OPCAO IF DATASET = '' THEN DO SAY 'Uso: EXEC MEUEXEC dataset-name opcao' EXIT 8 END SAY 'Dataset:' DATASET SAY 'Opção:' OPCAO EXIT 0

Para acessar todos os parâmetros como uma string única (sem dividir por espaço), use ARG TUDO — e depois processe manualmente com funções de string como WORD() e WORDS(), que você aprenderá no artigo de funções.