CURIOSIDADES DEL REXX

Todo lo relacionado con REXX en este ambiente.
Responder
Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

CURIOSIDADES DEL REXX

Mensaje por Vicente » 13 Dic 2012, 08:51

Comienzo este tema para animar al personal a escribir cosas que le hayan resultado sorprendetes, curiosas o con las que haya que tener especial cuidado usando REXX.

Aquí va mi primera aportación:
OJO: el valor de a es un espacio en blanco y el de b nulo.
¿Que ocurrirá al ejecutar este REXX? ¿Cual será el bloque que se ejecute el IF o el ELSE?

Código: Seleccionar todo

a = ' '                           
b = ''                            
IF b = a THEN DO                  
   SAY 'SON INGUALES'             
   SAY 'Longitud de a =' LENGTH(a)
   SAY 'Longitud de b =' LENGTH(b)
END                               
ELSE DO                           
   SAY ' SON DISTINTOS'           
   SAY 'Longitud de a =' LENGTH(a)
   SAY 'Longitud de b =' LENGTH(b)
END                               
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

riloama
Colaborador
Colaborador
Mensajes: 187
Registrado: 02 Sep 2008, 18:39
Ubicación: Caracas - Veenzuela

Re: CURIOSIDADES DEL REXX

Mensaje por riloama » 14 Dic 2012, 00:44

Hola Vicente,
lindo ejemplo para empezar con las curiosidades del lenguaje y los cuidados en su uso.

La clave esta en que en REXX hay dos operadores de comparación de igualdad el '=' y el '==' ; para el caso de caracteres, el '=' rellena los operandos con espacios a izquierda y derecha y esta es la causa por la cual la comparacion realizada sale por igual; pero si se utiliza '==' la comparacion es estricta byte por byte y en este caso saldra por distinto.

Para agregar algunos ejemplos adicionales que pueden llamar la atencion

IF "CARLOS" = "CARLOS " saldra por igual.

IF "CARLOS" = " CARLOS" saldra por igual.
y
IF "CARLOS" = " CARLOS " tambien saldra por igual.

En forma identica existen > y >> , < y << , >= y >>= , <= y <<= , \= y \== .

Los estimados REXXeros deben tenerlo en cuenta.
Saludos

riloama

riloama
Colaborador
Colaborador
Mensajes: 187
Registrado: 02 Sep 2008, 18:39
Ubicación: Caracas - Veenzuela

Re: CURIOSIDADES DEL REXX

Mensaje por riloama » 14 Dic 2012, 00:49

Estimados,

lamentablemente en el texto que envie se han perdido los espacios ; en los ejemplos hagan de cuenta que el caracter _ es el espacio.

IF "CARLOS" = "CARLOS____________________________________ " saldra por igual.

IF "CARLOS" = "____________________________________ CARLOS" saldra por igual.
y
IF "CARLOS" = " ___________CARLOS________________________ " tambien saldra por igual.
Saludos

riloama

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: CURIOSIDADES DEL REXX

Mensaje por Vicente » 14 Dic 2012, 04:41

Hola:
Colegas con tendencia matemática, dados a utilizar los nombres de variables X e Y deberían tener cuidado con esto:
¿Qué ocurrirá aquí?

Código: Seleccionar todo

Y = 25          
X = Y + 33      
SAY 'Subtotal='Y
SAY 'Total='X   
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Re: CURIOSIDADES DEL REXX

Mensaje por acevedo » 14 Dic 2012, 10:10

Código: Seleccionar todo

SAY 'Total='X   
seguro que me ha pasado unas cuantas veces y es que el Rexx identifica el formato Hexadecimal con ''x.

pero bueno, en éste ejemplo bastaria con cambiar

Código: Seleccionar todo

SAY 'Total='X   
por

Código: Seleccionar todo

SAY 'Total=' X   

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: CURIOSIDADES DEL REXX

Mensaje por Vicente » 17 Dic 2012, 04:51

Hola:
Otra de las cosas que más sorprende al que comienza con REXX es que sea un lenguaje recursivo.
Da la posibilidad de escribir rutinas y llamarse a sí mismas guardando por separado los valores de las variables en cada nivel de llamada.
Quien pueda adaptar su cerebro a la recursividad puede conseguir, con pocas lineas de código, resolver problemas de calculo combinatorio, recorrer árboles jerárquicos, resolver problemas de juegos (sudoku, juegos de tablero, solitarios, etc.).

Este ejemplo es del libro de REXX:

Código: Seleccionar todo

/* Calculo de n! = n*(n-1)*(n-2)*...*2*1   */
CALL FACTORIAL 5                             
SAY 5'! =' result                            
EXIT                                         
                                             
FACTORIAL: PROCEDURE                         
ARG n                                        
IF n=0 THEN RETURN 1                         
[b]CALL FACTORIAL n-1[/b]                           
RETURN result * n                            
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: CURIOSIDADES DEL REXX

Mensaje por Vicente » 17 Dic 2012, 04:54

Quitad del ejemplo y .
Ha sido un intento fallido de escribir con letra Bold (negrita)

Os animo a escribir vuestras experiencias con REXX que os hayan sorprendido, o que al menos os hayan resultado curiosas.
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: CURIOSIDADES DEL REXX

Mensaje por Vicente » 02 Oct 2014, 04:19

Hola a todos,
Escribo aquí una nueva curiosidad o pequeño reto del REXX surgido recientemente en un hilo de este foro.

Código: Seleccionar todo

/* REXX no decide bien */
a = 'VICENTE12345678901234ANTONIO'
b = 'ANTONIO12345678901235VICENTE'
c = SUBSTR(a,8,14)
d = SUBSTR(b,8,14)
IF c < d THEN DO
   SAY 'c es menor que d'
END
IF c = d THEN DO
   SAY 'c es igual que d'
END
IF c > d THEN DO
   SAY 'c es mayor que d'
END
¿Que dirá este programa?
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 542
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: CURIOSIDADES DEL REXX

Mensaje por Vicente » 28 Dic 2014, 15:11

Hola a todos:
Después de casi tres meses, voy a comentar yo mismo la curiosidad anterior:
Por defecto, REXX maneja números de hasta nueve cifras, esta es su precisión.
SI vamos a manejar numeros mayores, para no llevarnos sorpresas, deberemos utilizar, al principio del programa, la instrucción:
NUMERIC DIGITS num
Donde num es la cantidad de cifras que tendrá el mayor número a utilizar

Un saludo a todos
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
jlanderos
Usuario
Usuario
Mensajes: 18
Registrado: 26 Sep 2017, 18:21
País: México
Ciudad: CDMX
Ocupación: IT Specialist

Re: CURIOSIDADES DEL REXX

Mensaje por jlanderos » 29 Sep 2017, 18:38

Vicente escribió:Hola a todos,
Escribo aquí una nueva curiosidad o pequeño reto del REXX surgido recientemente en un hilo de este foro.

Código: Seleccionar todo

/* REXX no decide bien */
a = 'VICENTE12345678901234ANTONIO'
b = 'ANTONIO12345678901235VICENTE'
c = SUBSTR(a,8,14)
d = SUBSTR(b,8,14)
IF c < d THEN DO
   SAY 'c es menor que d'
END
IF c = d THEN DO
   SAY 'c es igual que d'
END
IF c > d THEN DO
   SAY 'c es mayor que d'
END
¿Que dirá este programa?
Saludos Vicente:

Este ejemplo es clásico cuando se trabaja con número de cantidades enormes. Existe una variable, funcion, o configuración, que controla la cantidad de "posiciones" que REXX tratará de controlar.

Me parece que se llama "NUMERIC DIGITS 9" Por default, se coloque o no en nuestro programa, está configurada en 9. Si se coloca del tamaño de la cifra a comparar REXX controlará el resultado dando el resultado correcto.

Código: Seleccionar todo

/* REXX */                        
NUMERIC DIGITS 14                 
a = 'VICENTE12345678901234ANTONIO'
b = 'ANTONIO12345678901235VICENTE'
c = substr(a,8,14)                
d = substr(b,8,14)                
if c < d then                     
   say 'c es menor que d'         
if c = d then                     
   say 'c es igual que d'         
if c > d then                     
   say 'c es mayor que d'         
exit 0

Saludos.

Responder