Skip to main content

Usando STEM en REXX para manejar arreglos dinámicos

· 3 min read
Héctor Mansilla Arias
Artesano Digital

1. Definición de STEM

En REXX, el manejo de arreglos dinámicos es una tarea común, y la función STEM es una herramienta poderosa para facilitar esta tarea.

Un STEM es el único mecanismo de estructura de datos compuesta nativo del lenguaje REXX. Es una variable cuyo nombre termina obligatoriamente en punto ., y que permite almacenar y recuperar colecciones de valores relacionados mediante el uso de índices.

La especificación formal del lenguaje REXX (ANSI X3.274-1996) define al stem como:

"Una variable compuesta cuyo nombre base (el stem) es compartido por un conjunto ilimitado de variables derivadas, cada una identificada por un índice que puede ser numérico o alfanumérico."

2. Anatomía de un STEM

     nombre_stem . indice
│ │ │
│ │ └─── Cola (tail): identifica el elemento
│ └──────── Punto separador — OBLIGATORIO
└──────────────── Nombre base — siempre termina en "."

Reglas del nombre base

  • Debe seguir las reglas de cualquier variable REXX (letras, números, _, !, ?, @, #, $)
  • Debe terminar siempre en punto .
  • No distingue mayúsculas de minúsculas: LINEA. y linea. son el mismo stem

Reglas del índice (cola)

  • Puede ser numérico: stem.1, stem.2, stem.99
  • Puede ser alfanumérico: stem.NOMBRE, stem.CLAVE
  • Puede ser compuesto (múltiples niveles): stem.1.2, stem.A.B.C
  • No tiene límite de niveles de profundidad

3. Tipos de STEM por dimensión

3.1 STEM unidimensional — lista simple

ciudad.1 = "Santiago"
ciudad.2 = "Buenos Aires"
ciudad.3 = "Lima"
ciudad.0 = 3 /* convención: total de elementos */

Equivalente conceptual en otros lenguajes:

Java/C:   String[] ciudad = {"Santiago", "Buenos Aires", "Lima"};
Python: ciudad = ["Santiago", "Buenos Aires", "Lima"]

3.2 STEM bidimensional — tabla

empleado.1.nombre = "Juan"
empleado.1.edad = "35"
empleado.2.nombre = "Maria"
empleado.2.edad = "28"

Equivalente conceptual:

Java:    String[][] empleado = {{"Juan","35"},{"Maria","28"}};
Python: empleado = [{"nombre":"Juan","edad":35}, ...]

3.3 STEM con índice alfanumérico — diccionario

config.HOST     = "MAINFRAME01"
config.PORT = "3270"
config.USUARIO = "USR001"

Equivalente conceptual:

Python:  config = {"HOST":"MAINFRAME01", "PORT":"3270"}
Java: Map<String,String> config = new HashMap<>();

4. La convención .0 — elemento de control

En REXX no existe un operador nativo para conocer cuántos elementos tiene un stem. Por ello, la comunidad y los comandos del sistema (como EXECIO) adoptaron una convención universal:

stem.0 = N    /* N = cantidad total de elementos del stem */

Esta convención es:

  • Respetada automáticamente por EXECIO, OUTTRAP, y otros comandos del sistema
  • Responsabilidad del programador mantenerla cuando construye stems manualmente
  • Fundamental para poder iterar correctamente:
/* Sin convención .0 — no se sabe cuándo parar */
DO i = 1 TO ???
SAY stem.i
END

/* Con convención .0 — iteración correcta y segura */
DO i = 1 TO stem.0
SAY stem.i
END

5. El valor por defecto

Una característica única y poderosa de los stems en REXX es que se puede asignar un valor por defecto a todos sus elementos no inicializados con una sola instrucción:

stem. = ""        /* todos los elementos no asignados valdrán "" */
stem. = 0 /* todos los elementos no asignados valdrán 0 */
stem. = "N/A" /* todos los elementos no asignados valdrán N/A*/

¿Por qué es importante?

Sin valor por defecto, referenciar un elemento no inicializado en REXX retorna el nombre de la variable en mayúsculas como valor, lo cual puede causar resultados inesperados:

/* Sin inicializar */
SAY bloque.99 /* imprime "BLOQUE.99" — no un error, sino el nombre */

/* Con inicialización */
bloque. = ""
SAY bloque.99 /* imprime "" — valor vacío controlado */