sábado, 8 de septiembre de 2007

La sentencia parse version

La instrucción parse de REXX permite, entre muchas otras cosas, saber con qué intérprete y qué versión del mismo estamos trabajando. A través de la sentencia parse version rexxVersion, el intérprete da a la variable un valor que indica el nombre del intérprete, el nivel del lenguaje y la fecha del intérprete.

Así, por ejemplo, si es el intérprete de REXX clásico de eComStation el que interpreta el código, la variable valdrá REXXSAA 4.00 3 Feb 1999. Si es Regina, puede resultar algo como REXX-Regina_3.3(MT) 5.00 25 Apr 2004 en las versiones más recientes o REXX-Regina_3.0 4.95 25 Apr 2002 en versiones anteriores. Si es Reginald, puede devolver REXX-Reginald_4.6 4.00 13 Aug 2005, por ejemplo. Si es Open Object REXX, el resultado podría ser REXX-ooRexx_3.0(MT) 6.00 28 Mar 2005.

En el primer ejemplo, REXXSAA identifica el intérprete REXX como el que forma parte de OS/2 y eComStation (si bien el intérprete REXX que forma parte del sistema operativo PC-DOS de IBM también se identifica a sí mismo como REXXSAA como probablemente le ocurra a alguna implementación más de IBM). El número 4.00 corresponde al nivel del lenguaje: el 4.00 corresponde al definido por la segunda edición de The REXX Language de Mike Cowlishaw, el nivel 5.00 corresponde al definido por el estándar ANSI de 1996 y el 6.00 corresponde al superconjunto de REXX clásico que es Object REXX. Y la fecha se supone que indica la fecha del intérprete en el mismo formato que date().

El estándar ANSI especifica que el nombre del intérprete debe ser la palabra REXX en mayúsculas seguida del nombre del intérprete en si mismo. Pero en algunos casos, el intérprete no sigue esa norma, como en el caso del Object REXX de IBM, que devuelve OBJREXX 6.00 18 May 1999, o BRexx, que devuelve brexx 2.1.0 Mar 11 2003 (debe apreciarse que en este caso BRexx tampoco indica el nivel del lenguaje, sino su versión y que el formato de fecha no es el que se considera correcto por el estándar ANSI).

Entre los intépretes más modernos se ha extendido la costumbre de indicar la versión del intérprete y la indicación de si es o no multithreaded (multihilo):
  • Regina (multihilo): REXX-Regina_3.3(MT) 5.00 25 Apr 2004
  • Regina (ejecutable estático): REXX-Regina_3.3 5.00 25 Apr 2004
  • Reginald: REXX-Reginald_5.0 4.00 9 Apr 2006
  • Reginald Lite: REXX-RegLite_5.0 4.00 3 Apr 2006
  • Open Object REXX: REXX-ooRexx_3.0(MT) 6.00 28 Mar 2005

El distinguir que intérprete y/o que nivel del lenguaje ejecuta nuestro código nos permite aprovechar características de un intérprete concreto o un nivel del lenguaje sin dejar a los otros fuera.

El manejo de ficheros en REXX es una de las cosas que más cambian de una implementación a otra del lenguaje. Utilizando parse version podemos hacer lo siguiente:
parse version rxInterpreter rxLevel rxDate
select
when rxLevel < 4 then
IO_routines = 'EXECIO'
when rxLevel < 5 then
IO_routines = 'ANSI'
when rxLevel >= 5 then
IO_routines = '.STREAM'
otherwise
nop
end
para decidir si usamos el comando EXECIO de los mainframes como sistema de manejo de ficheros, las funciones del estándar ANSI (stream, charin, lineout...) o el objeto Stream propio de Object REXX. O, si queremos dar soporte a BRexx y AREXX:
parse version rxInterpreter rxLevel rxDate
select
when rxInterpreter = 'AREXX' then
IO_routines = 'AREXX'
when rxInterpreter = 'brexx' then
IO_routines = 'BREXX'
when rxLevel < 4 then
IO_routines = 'EXECIO'
when rxLevel < 5 then
IO_routines = 'ANSI'
when rxLevel >= 5 then
IO_routines = '.STREAM'
otherwise
nop
end

En ese ejemplo, consultando la variable IO_routines, podemos decidir qué código queremos ejecutar.

Evidentemente este sistema es de utilidad limitada. Hay tantos intérpretes REXX para tantas plataformas que es imposible para cualquier programador conseguir que un programa de mediana envergadura se aproveche de parse version para que se ejecute en todos ellos.

No hay comentarios: