Articulo de referencia

Objeto REXX

\nooRexx (since 2005)"},"influenced by":{"wt":"[[Rexx]], [[Smalltalk]]"},"influenced":{"wt":"[[NetRexx]]"},"programming language":{"wt":"[[C++]]"},"platform":{"wt":"[[IA-32]], [...

Object REXX es un lenguaje de programación de alto nivel , de propósito general , interpretado y orientado a objetos ( basado en clases ) . Actualmente se le conoce generalmente como ooRexx (abreviatura de Open Object Rexx ), que es el sucesor directo y mantenido de código abierto de Object REXX.

Se trata de una continuación y una extensión significativa del lenguaje de programación Rexx (denominado aquí Rexx clásico ), que conserva todas las características y la sintaxis, a la vez que incorpora capacidades completas de programación orientada a objetos (POO) y otras mejoras. Siguiendo la influencia del Rexx clásico, ooRexx está diseñado para ser fácil de aprender, usar y mantener. Cumple esencialmente con el estándar ANSI X3.274-1996 [ 1 ] del Instituto Nacional Estadounidense de Estándares (ANSI) para "Tecnología de la Información - Lenguaje de Programación REXX" y, por lo tanto, garantiza la interoperabilidad multiplataforma con otras implementaciones de Rexx compatibles. En consecuencia, los programas Rexx clásicos suelen ejecutarse en ooRexx sin necesidad de modificaciones.

También existe Rexx Object Oriented (roo!), que fue desarrollado originalmente por Kilowatt Software y es una implementación orientada a objetos sin mantenimiento del Rexx clásico. [ 2 ]

Historia

En 1988, el proyecto "Oryx" de IBM , bajo la dirección técnica de Simon C. Nash, experimentó con la fusión de Rexx clásico con el modelo de objetos de Smalltalk . [ 3 ] [ 4 ] La motivación del proyecto era transferir las ventajas de la POO a Rexx clásico manteniendo la compatibilidad y, por lo tanto, transfiriendo la usabilidad de Rexx clásico a la POO. [ 5 ] Inicialmente, los proyectos se centraron en aspectos de la POO como tratar todo como un objeto , la encapsulación y el paso de mensajes basados ​​en objetos, la concurrencia basada en objetos , las clases y la herencia . [ 6 ]

Logotipo de IBM Object REXX
REXX de objetos (hasta 2004)

Este trabajo inicial condujo más tarde, bajo la dirección de Rick McGuire, al primer prototipo de Object REXX, que se presentó en 1992. En 1994, IBM anunció que Object REXX reemplazaría al Rexx clásico como intérprete REXX estándar en la siguiente versión de OS/2 . [ 4 ] En 1996, Object REXX [ a ] ​​se lanzó como parte del sistema operativo OS/2 Warp 4. [ 7 ] En 1997, siguieron versiones para Windows 95 , Windows NT y Linux . [ 8 ] [ 9 ] En 1999 se lanzó una versión de Object REXX para AIX V4.1.5 o superior. [ 10 ] En 2000, siguieron versiones para zLinux y Sun/Solaris . Para Windows 2000 , Windows Me , Windows 98 y Windows NT 4.0 , la última actualización importante para Object REXX se lanzó en 2001. [ 11 ]

Logotipo de ooRexx
ooRexx (desde 2005)

El 12 de octubre de 2004, IBM anunció la descontinuación de Object REXX y transfirió el código fuente y los derechos de licencia [ b ] al grupo de interés especial (SIG) sin fines de lucro, la Rexx Language Association (RexxLA). El código que IBM publicó como código abierto no incluía las clases para IBM System Object Model (SOM), conocido como el marco de objetos para Workplace Shell (WPS) de OS/2. [ 12 ] Aunque IBM descontinuó el desarrollo de SOM en 1997, sigue siendo un marco fundamental para OS/2. [ 13 ] La versión de Object REXX para OS/2 incluye clases para dar soporte a SOM y WPS. [ 14 ] [ 15 ] Estas se incluyen en el producto sucesor inicial de OS/2, eComStation , y también en su descendiente actual, ArcaOS , para el cual el intérprete original de Object REXX de IBM sigue estando disponible. [ 16 ]

En 2005, RexxLA lanzó ooRexx como una nueva encarnación de Object REXX como software libre y de código abierto bajo la Licencia Pública Común . [ 17 ] Esta primera versión de ooRexx 3.0.0 fue profundamente refactorizada en comparación con el código fuente original de IBM para aumentar su legibilidad. Posteriormente, el núcleo de ooRexx fue reescrito en C++ puro , y se diseñó e implementó una nueva arquitectura e interfaz nativa bajo la dirección técnica de Rick McGuire. Este trabajo permitió a RexxLA lanzar ooRexx 4.0.0 con soporte para 64 bits en 2009. Hasta el día de hoy, RexxLA continúa desarrollando, brindando soporte y manteniendo ooRexx, así como Rexx clásico y NetRexx . Además, RexxLA organiza simposios internacionales anuales. [ 18 ]

Comunicados

La siguiente tabla contiene características y cambios notables de las principales versiones de los intérpretes Object REXX y ooRexx. Todas las versiones de ooRexx y la documentación necesaria están disponibles gratuitamente en SourceForge . [ 19 ] [ 20 ] Para distribuciones basadas en Arch Linux, la versión actual y la de desarrollo están disponibles como Arch User Repository . Desde la versión 5.0.0 existen versiones portátiles del intérprete que se pueden usar sin instalación, y también existe una versión no oficial para OS/2 . El paquete "net-oo-rexx" contiene la última versión portátil de ooRexx, Netrexx , un intérprete de comandos de Netrexx, el puente Java y los paquetes asociados , un intérprete de comandos para ooRexx y varios otros paquetes y programas . [ 21 ]

Para Intellij IDEA , ooRexxPlugin agrega soporte para resaltado de sintaxis , verificación de sintaxis, autocompletado de código y soporte de documentación modelado a partir de Javadoc usando anotaciones . [ 22 ] A partir de septiembre de 2012 hay soporte para resaltado de sintaxis de características de ooRexx 4.0 en Vim. [ 23 ] RexxCPS es un punto de referencia que mide la cantidad de cláusulas Rexx (unidades de sintaxis independientes en una línea) por segundo que procesa un intérprete.

Leyenda:
Sin soporte
Compatible
Última versión
Versión preliminar
Versión futura

Filosofía del diseño

ooRexx sigue la filosofía de diseño del Rexx clásico para crear un lenguaje de programación " centrado en el ser humano " que sea fácil de aprender, codificar, recordar y mantener. Esto se logra, en parte, manteniendo el lenguaje pequeño y siguiendo el principio de mínima sorpresa . [ 2 ] [ 34 ] Una sintaxis legible es posible gracias a que no distingue entre mayúsculas y minúsculas, es de formato libre, requiere la menor cantidad de puntuación posible y utiliza instrucciones en inglés sencillo. [ 34 ] Además, es un lenguaje de programación dinámico que ofrece flexibilidad y permite centrarse en el desarrollo en lugar de en las limitaciones del lenguaje.

Siguiendo el principio de diseño de "documentación antes de la implementación" del Rexx clásico, ooRexx ofrece una documentación completa de acuerdo con la Guía de estilo de IBM que incluye diagramas de sintaxis y ejemplos. [ 34 ] [ 32 ]

Instrucciones

Como en el Rexx clásico, hay instrucciones de asignación, instrucciones de palabras clave e instrucciones de comando. En consonancia con el deseo de mantener el lenguaje pequeño, ooRexx solo tiene treinta instrucciones de palabras clave. [ 32 ] A diferencia de muchos otros lenguajes, no hay palabras clave reservadas, por lo que las instrucciones de palabras clave como DO, SAY, ENDy IFpor ejemplo pueden usarse como nombres de variables durante una asignación. Esto evita tener que memorizar una larga lista de palabras reservadas . [ 35 ] Una asignación se usa para establecer o cambiar el valor de una variable. El signo igual ( =) se usa para crear una instrucción de asignación que puede usarse en combinación con once operadores para secuencias de asignación extendidas como +=, -=, *=y otras. Las instrucciones de palabras clave como ARG, PARSE, PULLo USEtienen el mismo efecto que las asignaciones. [ 32 ]

En los casos en que una instrucción no sea ni una asignación ni una instrucción de palabra clave, debe ser una expresión válida, por ejemplo, un símbolo, una cadena literal, que se considera una instrucción de comando, cuyo valor el intérprete pasa al entorno de comandos actual, por ejemplo, editor, sistema operativo, para su ejecución; el intérprete establece una variable RCpara el código de retorno. Además, la ADDRESSinstrucción permite redirigir comandos a entornos de comandos específicos como Bourne Shell , Bash , Z-Shell , Símbolo del sistema y otros, algunos editores incluidos ISPF , TSO EDIT, XEDIT y sus adaptaciones , así como interceptar errores.

a = "hola mundo" /* instrucción de asignación */hacer i = 1 a 2 /* instrucción de palabra clave "HACER" */decir "ronda #" i ":" a /* instrucción de palabra clave "DECIR" */fin /* instrucción de palabra clave "FIN" */"echo Hola Mundo" /* comando para el sistema operativo */decir "RC:" rc /* código de retorno numérico del comando */

Además de los tres tipos de instrucciones del Rexx clásico, ooRexx añade instrucciones directivas [ c ] que deben colocarse al final del programa. Tras la carga y la comprobación de sintaxis, el intérprete ejecuta todas las directivas definidas para configurar el entorno de ejecución del programa antes de ejecutar más instrucciones. Las directivas pueden utilizarse para definir rutinas , clases , métodos , atributos u opciones de ejecución, como el número de dígitos que se utilizarán en las operaciones aritméticas. Para que las instrucciones directivas sean fácilmente reconocibles, se introducen con dos puntos consecutivos ( ::). [ 32 ]

Para facilitar la reutilización del código, la ::REQUIRESdirectiva permite la integración de otro programa Rexx (también conocido como paquete) o una biblioteca externa (nativa). Esta directiva hace que el intérprete permita el PUBLICacceso directo a todas las rutinas y clases que especifican la opción del programa Rexx (paquete) indicado. Los paquetes externos suelen usar la extensión de archivo .cls, por ejemplo ::requires "csvstream.cls"o ::requires "json.cls". Algunos paquetes y bibliotecas externas se incluyen con el intérprete ooRexx.

Forma libre

ooRexx tiene una sintaxis de formato libre donde la posición del código del programa es irrelevante, lo que permite un alto grado de flexibilidad. Antes de la ejecución, el intérprete fusiona varios espacios en blanco sin comillas en uno solo, mientras que una cadena de caracteres encerrada entre comillas (simples o dobles) no se modifica. La concatenación se puede solicitar explícitamente con dos barras verticales ( ||), o implícitamente separando los términos con espacios o yuxtaponiéndolos. Opcionalmente, las cláusulas se pueden extender a lo largo de varias líneas utilizando la coma ( ,) o el signo menos ( -) como carácter de continuación, o se pueden usar varias cláusulas en una sola línea, separadas por un punto y coma ( ;). [ 32 ] Dado que un lenguaje de formato libre proporciona flexibilidad y requiere menos reglas sintácticas a considerar, se supone que facilita el esfuerzo de aprendizaje al reducir la carga cognitiva intrínseca . [ 36 ]

di "¡Hola Mundo!" /* salida: ¡Hola Mundo! */decir "Esto" 'es' - /* guion final para continuación */"REXX" || "!" /* Salida: ¡Esto es REXX! */

No distingue entre mayúsculas y minúsculas

Al igual que el Rexx clásico, ooRexx es un lenguaje de programación que no distingue entre mayúsculas y minúsculas . Por consiguiente, el intérprete de ooRexx pone en mayúscula todos los caracteres fuera de las comillas (simples o dobles) e ignora las mayúsculas y minúsculas en las instrucciones, los nombres de las variables y todos los demás aspectos del lenguaje. Solo las secuencias dentro de las comillas se tratan como cadenas literales y no se modifican durante el procesamiento. [ 32 ] Dado que no es necesario diferenciar las mayúsculas y minúsculas, se necesitan aprender menos detalles adicionales y se evitan errores de sintaxis frustrantes. [ 36 ]

a = "Esto es" rexx !Di A /* salida: ¡Esto es REXX! */DI a /* salida: ¡Esto es REXX! */

Todo es un objeto.

Mientras que el Rexx clásico sigue la filosofía de que "todo es una cadena" y considera la cadena como su único tipo de dato, ooRexx considera todo como un objeto, incluyendo objetos que no son cadenas, como matrices, flujos y muchos más. Los objetos se manipulan mediante métodos en lugar de funciones tradicionales.

En ooRexx, una variable de cadena es una referencia a un objeto de cadena y no necesita ser declarada, lo que reduce el esfuerzo para los programadores en comparación con los lenguajes de tipado estricto . [ 37 ] Un objeto de cadena puede tener cualquier longitud y contener cualquier carácter, incluidos valores numéricos. Por lo tanto, es posible cambiar valores numéricos mediante manipulaciones de cadena y métodos de la Stringclase. Además, una variable de cadena puede contener cualquier tipo de expresión, incluidas instrucciones ejecutables, que pueden evaluarse o ejecutarse con la INTERPRETpalabra clave instruction. [ 32 ]

a = 2 /* cadena con valor numérico */a = a || '0' /* cadena resultante: 20 */str = "hacer i = 1 a " a "; decir i; fin" /* la cadena contiene la instrucción del bucle */interpretar str /* interpreta cadena: cuenta hasta 20 */

Paradigma del mensaje

De forma similar al paradigma de mensajería implementado por Alan Kay en Smalltalk, en ooRexx todo es un objeto con el que se puede comunicar. La idea de enviar mensajes a objetos como si fueran seres vivos ayuda a los principiantes a aprender conceptos de POO. [ 35 ] A diferencia de Smalltalk, existe un operador de mensaje explícito, la tilde ( ~), donde el objeto receptor se coloca a su izquierda y se devuelve el resultado de la operación. El envío de un mensaje conlleva la activación de un método con el nombre correspondiente y la manipulación del objeto receptor. Al igual que en Smalltalk, los mensajes de ooRexx se pueden encadenar si ~~se utilizan dos tildes ( ) en lugar de una, devolviendo el objeto que recibió el método en lugar del resultado producido. [ 38 ]

El comportamiento predeterminado de la mayoría de los métodos se puede cambiar especificando una opción, que puede escribirse completa o abreviada y no distingue entre mayúsculas y minúsculas. Al leer el código, esto permite una comprensión literal y reduce el esfuerzo de aprendizaje para los principiantes, ya que no es necesario aprender el significado de las abreviaturas. [ 36 ] Por ejemplo, el método con el nombre stripelimina los espacios en blanco iniciales y finales por defecto. Este comportamiento se puede cambiar, por ejemplo, especificando "leading"o "l"como una opción. Mientras que las funciones se anidan en Rexx clásico, los mensajes se pueden encadenar en ooRexx, lo que mejora la legibilidad de una instrucción . [ 35 ]

a = "¡Soy ooRexx!"decir un /* salida: ¡Soy ooRexx! */decir una ~ Tira ( "Leading" ) /* salida: ¡Soy ooRexx! */decir una ~ tira ( "l" ) ~ inversa /* salida: !xxeRoo ma I */

Compatibilidad

ooRexx está diseñado para conservar todas las características del Rexx clásico y cumple esencialmente con el estándar ANSI para el lenguaje Rexx (X3.274-1996, "Programming Language REXX"). [ 1 ] A diferencia de una especificación opcional en el estándar ANSI, ooRexx no permite caracteres como @, #, $y ¢en símbolos. Mientras que en el Rexx clásico la expresión b. = a.da como resultado que b.se le asigne el valor predeterminado de a., el intérprete crea b.un alias para a.. Además, ooRexx permite --como marca de comentario y -como continuo de línea, que no están especificados en el estándar. [ 1 ]

Los scripts Rexx clásicos suelen ejecutarse sin cambios en ooRexx, lo que facilita la migración a las características de la POO al ritmo deseado, conservando el tiempo invertido en el código original. [ 2 ] Existen incompatibilidades con algunas implementaciones específicas de la plataforma, como Rexx para z/VM (por ejemplo, PARSE EXTERNALno es compatible con ooRexx). Si bien el Rexx clásico permite asignaciones vacías como , en ooRexx son necesarias las comillas . [ 39 ]x = ;x = "";

Personalización

ooRexx ofrece varios mecanismos de personalización, como extender funciones y clases integradas , usar métodos no especificados, agregar entornos de comandos y conmutadores de invocación o crear compilaciones propias. [ 40 ]

El comportamiento predeterminado de las funciones integradas se puede modificar añadiendo una etiqueta con el mismo nombre que la función que se desea sobrescribir (por ejemplo, date) al final del ámbito del programa o añadiendo una ::routinedirectiva. El código puede calcular los resultados por sí mismo o modificar los resultados de la función integrada original.

diga Fecha () /* salida, por ejemplo: 16 JUN 2025 */salidaFecha : return newDate () /* etiqueta que apunta a la rutina "newDate" */:: Rutina nuevaFecha newDate = date () ~ upper /* uso de date() BIF, pero con letras mayúsculas */devolver nuevaFecha 

Desde ooRexx 5.0.0 se han añadido espacios de nombres que permiten la creación de subclases de clases integradas. [ 40 ] [ 32 ] Esto hace posible extender las clases integradas, por ejemplo, añadiendo un método como ArrayInClosea la clase de flujo , que abre el flujo, lee el contenido y cierra el flujo en lugar de hacerlo en el ámbito del programa.

Di . stream ~ new ( "someFile.txt" ) ~ ArrayInClose: : Subclase de stream de clase rexx : stream /* crea una subclase de stream */:: Método ArrayInClose /* agrega un nuevo método a la clase de flujo */self ~ abrir /* abre el flujo */FileContent = self ~ ArrayIn /* leer contenido */self ~ close /* cierra el flujo */return FileContent /* devolver contenido */

La definición de un UNKNOWNmétodo permite que los objetos reciban mensajes no especificados. Se pasan dos argumentos: primero, el nombre del método no especificado y, segundo, una matriz de argumentos del mensaje original. [ 32 ] Este es un mecanismo básico del Java Bridge , que permite, entre otras cosas, el uso de todos los métodos Java disponibles. [ 41 ]

PackageObj = . Paquete ~ nuevo PackageObj ~ SomeMethod ( "First" , "Second" , "Third" ):: Paquete de clase: : Inicialización del métodoMétodo desconocidoUtilice arg MethodName , ArgArr decir "El método fue:" MethodName /* salida: El método fue: SOMEMETHOD */decir ArgArr /* salida: Primero, Segundo, Tercero */

Características

Sobre todo, ooRexx ofrece características de POO como subclases , polimorfismo , encapsulación de datos y herencia múltiple mediante clases mixin . El intérprete incluye la utilidad, que permite compilar programas ooRexx y, opcionalmente, codificar el resultado en base64 , un archivo sin código fuente que se inicia más rápido ya que el análisis y la compilación iniciales ya se han realizado. [ 38 ]rexxc

Análisis sintáctico

La PARSEinstrucción de palabra clave permite analizar una cadena de forma rápida y flexible, asignando partes de ella a variables en un solo paso. [ 2 ] La instrucción subsiguiente se utiliza para especificar el origen de la cadena, por ejemplo, ARGpara los argumentos que se enumeran cuando se llama al programa o función, VARpara variables, PULLpara colas de datos o entrada estándar (normalmente el teclado), VALUEpara cualquier expresión. Al usar VALUE, la WITHpalabra clave es necesaria para especificar el final de una expresión, seguido de un patrón de análisis. Este patrón puede ser una lista de variables, un número de posición o delimitadores literales; es posible usar estos patrones en combinación. Opcionalmente, se puede convertir la cadena a mayúsculas y minúsculas antes del análisis. [ 32 ]

str = "Persona: Rick McGuire"/* Analizar la cadena usando el literal ":" y espacios en blanco entre palabras en las variables a ("Persona"), b ("Rick") y c ("McGuire") */analizar var str a ":" b c /* analizar por literal y espacio en blanco */decir b c /* salida: Rick McGuire */

Procedimiento y función

ooRexx proporciona una nueva forma de definir procedimientos y funciones que no son específicos de una clase particular mediante la ::ROUTINEdirectiva ; a diferencia de la anterior PROCEDURE, el código definido con ::ROUTINEtiene un implícito RETURNal final. La CALLinstrucción se puede usar para invocar una rutina como un procedimiento. Además, las rutinas que devuelven valores a través de las RETURNinstrucciones de palabra clave se pueden llamar usando llamadas a funciones especificando el nombre de la rutina seguido de paréntesis. El contenido dentro de los paréntesis se pasa como argumentos a la rutina. Si bien la PARSE ARGinstrucción se puede usar para analizar argumentos de cadena recibidos y asignarlos a variables, la más reciente USE ARGdebe usarse para objetos de otros tipos. Además, la STRICTopción se puede usar para limitar la cantidad de argumentos que deben coincidir con la cantidad de nombres especificados. [ 32 ]

llamar a DoSomething /* Instrucción de palabra clave "CALL" */tabla = . stem ~ nuevo /* Objeto Stem para indsum */tabla [ 1 ] = 2 ; tabla [ 2 ] = 4diga indsum { tabla , 1.2 ) /* llamada a función que requiere usar arg */decir dirsum ( 2 , 4 ) /* ya sea analizar arg o usar arg está bien */:: Rutina HacerAlgo /* Directiva (procedimiento) "RUTINA" */decir "¡Hice algo!" /* salida: ¡Hice algo! *//* Retorno implícito porque next *//* Esta instrucción es una directiva. */:: Rutina dirsum /* Directiva (función) "ROUTINE" */analizar el argumento primero , segundo /* Válido porque ambos son cadenas. */devolver primero + segundo: : Rutina indsum /* Directiva (función) "ROUTINE" */use strict arg table , first , second /* no se puede usar parse arg con stem arg */Suma = tabla { primera } + tabla [ segunda ] /* realizar cálculo */return Sum /* "RETURN" resultado */

Clase y método

La ::CLASSdirectiva seguida de un nombre de clase hace que el intérprete defina una nueva clase. Después del nombre de la clase, se pueden establecer opciones como METACLASS, SUBCLASS, MIXINCLASS, ABSTRACTy INHERITpara utilizar características de POO. La ::METHODdirectiva se puede usar para definir un nuevo método de clase asociado con la última ::CLASSdirectiva. La ::ATTRIBUTEdirectiva se usa para definir un método de acceso que puede recuperar o asignar una variable de objeto. Mediante la EXPOSEinstrucción, una variable de objeto puede exponerse directamente a un método. [ 32 ]

d = . perro ~ nuevo ( "Bella" ) /* crea y asigna un perro */d ~ bark /* enviar mensaje bark */decir d ~ nombre /* salida: Bella */:: clase perro /* directiva de clase */:: nombre del atributo /* directiva de atributo */:: método init /* método de inicialización de objetos */Exponer nombre /* expone el nombre del perro */use arg name /* asigna "Bella" a name */:: método bark /* directiva de método */Nombre de exposicióndice Nombre "¡guau!" /* salida: ¡Bella hace guau! */

Manejo de errores

La instrucción de palabra clave se puede usar para cambiar el momento en que se activan SIGNALciertas condiciones . Se pueden especificar varias condiciones de interrupción , por ejemplo , o se activa mediante una instrucción de comando que indica un error o fallo al regresar, generada por una sintaxis de programa no válida u otras condiciones de error, se activa por un intento de interrupción externa (por ejemplo, la combinación de teclas Control-C ). Se puede usar para interceptar cualquier cosa que una condición de interrupción más específica no detecte. Otras condiciones de interrupción más específicas son (la operación aritmética tiene más dígitos que los especificados por la configuración actual), (el método utilizado no está especificado y el objeto no tiene método), (el objeto no devuelve un valor de cadena requerido), (error durante una operación de entrada o salida) o (uso de una variable no inicializada). [ 32 ]ONOFFERRORFAILURESYNTAXHALTANYLOSTDIGITSNOMETHODUNKNOWNNOSTRINGNOTREADYNOVALUE

La función integradaCONDITION se puede utilizar para recuperar información como el nombre de la condición interceptada actual y el proceso de instrucción resultante, el estado de la condición interceptada, una cadena descriptiva e información adicional del objeto. [ 32 ]

Señal de sintaxis /* interruptor en trampa de sintaxis */Digamos 1 + "AString" /* un cálculo imposible */SalidaSINTAXIS :ConditionObject = Condition ( Object ) /* obtener información adicional */decir "El código de error es" ConditionObject ~ Code /* salida: El código de error es 41.1 */decir ConditionObject ~ ErrorText /* salida: Conversión aritmética incorrecta. */

De manera similar, la CALLinstrucción de palabra clave se puede usar no solo para invocar una rutina , sino también para controlar la captura de ciertas condiciones cuando se especifica ONo OFFjunto con una captura de condición específica (por ejemplo, CALL ON HALTy CALL OFF HALT). Estas instrucciones no vacían la pila de control y la ejecución normal se reanuda cuando el manejador de condiciones regresa. [ 32 ]

Multihilo

Conceptualmente, ooRexx proporciona concurrencia basada en objetos , según la cual los objetos tienen recursos independientes para ejecutar métodos y pueden comunicarse entre sí mediante el paradigma de mensajería. Varios objetos pueden estar activos al mismo tiempo e intercambiar mensajes para la sincronización . [ 32 ] La concurrencia se puede lograr con la REPLYinstrucción de palabra clave, que provoca un retorno anticipado de un método mientras su resto continúa ejecutándose en un nuevo hilo. Alternativamente, la instrucción de palabra clave GUARDse puede usar para marcar un método como no protegido para que pueda ejecutarse junto con otros métodos de la misma clase. Finalmente, el uso del STARTmétodo (de la clase Objeto o Mensaje) hace que el receptor procese el mensaje recibido en un hilo separado, lo que también permite la concurrencia. [ 32 ]

Rastreo

Como en Rexx clásico, la TRACEinstrucción de palabra clave y la función integrada TRACE()facilitan la depuración. Ambas permiten controlar el nivel de detalle y habilitan la depuración interactiva en tiempo de ejecución. [ 42 ] Durante la depuración interactiva, el intérprete se detiene después de la mayoría de las instrucciones que se rastrean. [ 32 ] ooRexx 5.1.0 introduce la TraceObjectclase, que facilita el rastreo de programas multihilo, por ejemplo, al hacer más fácil determinar qué método está siendo protegido y bloqueado actualmente. [ 32 ] [ 42 ]

La cantidad de información adicional proporcionada se puede especificar mediante la opción "Thread", "Standard", "Full"o "Profiling". Por ejemplo, la "Full"opción muestra los ID de instancia interpretada, hilo, invocación y grupo de atributos, así como el estado de protección actual, el recuento de bloqueos, el indicador de bloqueo de protección reservado y el estado de espera. [ 42 ] [ 43 ]

trace off /* no rastrear el prólogo */. TraceObject ~ opción = "Completo" /* establecer la opción en "Completo" */. TraceObject ~ colector = . array ~ nuevo o = . Prueba ~ nuevo /* crea una instancia */decir "iniciando trabajador de forma asíncrona..."o ~ start ( "do" ) /* se ejecuta en un nuevo hilo */decir "a punto de esperar a que el trabajador termine..."o ~ esperar /* sincronizar con el trabajador */decir "la espera ha terminado":: prueba de clase: : método init /* constructor */exponer bloqueo /* atributo de acceso */bloqueo = . verdadero /* establecer valor predeterminado */:: método espera sin protección exponer bloqueo /* atributo de acceso */protección activada cuando lock = . falso: : método do /* realizar algún trabajo */exponer bloqueo /* atributo de acceso */t = aleatorio ( 1 , 999 ) / 1000decir "hacer: trabajando durante" t "segundos"llamar a sysSleep t decir "hacer: terminar el trabajo"bloqueo = . falso /* liberar bloqueo */:: resultados de rastreo de opciones

El depurador ooRexx, que también se incluye en el paquete "net-oo-rexx", se basa en Trace y ofrece una interfaz gráfica de usuario (GUI) que utiliza el puente Java para facilitar la depuración en todas las plataformas. [ 21 ] [ 44 ]

Funciones y clases integradas

Como ooRexx pretende ser compatible con Rexx clásico, las funciones integradas tradicionales siguen estando disponibles. [ 38 ] La versión 5.1.0 proporciona 82 funciones integradas, incluidas funciones de manipulación de caracteres, conversión e información, muchas de las cuales llaman a métodos de la clase. Además, la biblioteca de enlace dinámicoString integrada RexxUtil ofrece 29 funciones multiplataforma, 25 específicas de Windows y cuatro específicas de Unix para manipular archivos, directorios, clases y objetos del sistema. [ 32 ]

En consonancia con sus raíces orientadas a objetos, ooRexx proporciona la mayor parte de su funcionalidad a través de clases y métodos integrados. ooRexx 5.1.0 se entrega con un total de 58 clases integradas, que se dividen en los grupos de clases Fundamental, Stream, Collection y Utility. [ 32 ]

Clases fundamentales

Las clases fundamentales son los bloques de construcción esenciales para todas las demás clases. La Objectclase es la raíz de la jerarquía de clases , de modo que sus métodos y atributos están disponibles para todos los objetos instanciados de cada clase. La Classclase (también llamada metaclase) se utiliza para mantener las propiedades de una clase (como sus objetos de método) y se utiliza para crear instancias (también llamadas objetos, valores). Por lo tanto, se crea una instancia de esta clase (también llamada objeto de clase) para cada ::CLASSdirectiva. [ 32 ] El propósito de la Methodclase y Routinela clase es crear objetos de método o rutina. La Stringclase proporciona métodos para manejar cadenas, tales como operaciones lógicas, concatenación, copia, unión, división, inversión, aritmética, conversión y otras. [ 38 ] Una Packageinstancia de clase contiene todas las rutinas, clases y métodos creados y gestiona las dependencias externas referenciadas por ::REQUIRESlas directivas. La Messageclase permite el envío asíncrono de mensajes, lo que permite la ejecución concurrente de métodos. [ 32 ] [ 38 ]

Clases de transmisión

Las clases de flujo facilitan la comunicación con objetos externos como archivos, colas, interfaces seriales , dispositivos, etc. La Streamclase en sí es una clase mixin que puede ser heredada y es una subclase de las InputOutputStreamclases InputStream,y OutputStream. [ 32 ]

La Streamclase proporciona métodos para abrir, leer, escribir y cerrar flujos, vaciar búferes, establecer la ubicación del archivo, recuperar información y otras operaciones relacionadas con flujos. Si bien el OPENmétodo abre el flujo, el ARRAYINmétodo puede usarse para leer su contenido en un objeto de matriz. El CLOSEmétodo cierra explícitamente un flujo antes de que el recolector de basura lo libere . [ 32 ] [ 38 ]

StreamObj = . stream ~ new ( "someFile.txt" ) /* crear objeto de flujo */StreamObj ~ abrir /* abrir el flujo */FileContent = StreamObj ~ ArrayIn /* leer contenido */StreamObj ~ close /* cierra el flujo */decir FileContent /* muestra el contenido */

Clases de colección

Una colección es un objeto que contiene múltiples elementos con índices asociados que permiten recuperarlos mediante los métodos AT`or` []. Existen las clases `MapCollection`, `SetCollection` y `OrderedCollection`, todas las cuales permiten la manipulación de un tipo de colección específico. [ 38 ]

Una MapCollection es una clase mixin que define el conjunto básico de métodos implementados por todas las colecciones que asignan un índice a un valor. Las clases Directory, StringTable, IdentityTable, Properties, Table, Relationy Stemheredan estos métodos. [ 32 ] Un objeto Directory o StringTable es una colección de índices de cadena únicos. En un objeto IdentityTable, cada elemento está asociado con un único índice, y solo puede haber un elemento para cada índice. El objeto Properties proporciona métodos específicos para guardar y cargar propiedades en archivos. A diferencia de un objeto Table, que no puede contener índices duplicados, un objeto Relation es una colección en la que los elementos pueden tener el mismo índice, que puede ser de cualquier tipo de objeto.

Se crea automáticamente un objeto Stem cuando se utiliza una variable compuesta. Al igual que en Rexx clásico, dicha variable consta de un tallo y una cola, separados por un punto ( .). Si bien el tallo debe comenzar con una letra, la cola puede ser cualquier carácter. El uso de una sola cola numérica crea el mismo efecto que una matriz , mientras que se pueden usar varias colas numéricas para crear una matriz multidimensional. [ 32 ] [ 38 ]

frutas . 1 = "Manzana" /* asignando a la variable raíz */frutas . 4 = "Naranja" /* asignando a la variable raíz */decir frutas . 4 /* salida: Naranja */decir frutas . [ 1 ] /* salida: Manzana */

Las SetCollections son tipos especiales de MapCollections donde el índice y el elemento son el mismo objeto. Si bien los índices en un Setobjeto son únicos, cada índice en un Bagobjeto puede aparecer más de una vez. [ 32 ]

Una OrderedCollection es una clase mixin que define los métodos básicos para todas las colecciones que tienen un orden de índice inherente, como las clases List, Queue, CircularQueuey Array. Un objeto List permite agregar nuevos elementos, para los cuales se crea un nuevo índice, en cualquier posición de una colección. El índice asociado permanece válido para ese elemento independientemente de otras adiciones o eliminaciones. Un objeto Queue permite eliminar elementos del principio y agregarlos al final o al principio de la cola. Un objeto CircularQueue es una cola con un tamaño predefinido. Una vez que se llega al final de la cola circular, se insertan nuevos elementos desde el principio para reemplazar los elementos anteriores. [ 32 ] [ 38 ]

Un Array es una colección secuenciada ordenada por índices de números enteros. Al igual que otras clases de colecciones, esta Arrayclase proporciona el MAKESTRINGmétodo para codificar sus elementos como un objeto de cadena. [ 32 ]

ArrayObj = . array ~ of ( "Uno" , "Dos" , "Tres" ) /* array con 3 elementos */decir ArrayObj ~ en ( 2 ) /* salida: Dos */decir ArrayObj ~ makeString (, "; " ) /* salida: Uno; Dos; Tres */

Clases de utilidad

Las clases de utilidad son una colección de 31 clases que proporcionan implementaciones para tareas comunes. La MutableBufferclase permite una mayor eficiencia en operaciones con cadenas, como la concatenación, ya que no es necesario asignar un nuevo objeto. La Fileclase proporciona métodos para listar archivos en un directorio o recuperar información sobre archivos y directorios. [ 32 ]

FileObj = . File ~ new ( "~/someFolder/" ) /* crea un objeto de archivo para la carpeta */FileArr = FileObj ~ ListFiles /* recuperar matriz de archivos */hacer FilePath sobre FileArr /* iterar sobre los elementos del array */diga FilePath /* salida: elemento FilePath */fin

Las clases DateTimeo admiten la recuperación y el formato de una fecha, hora o marca de tiempo en varios formatos y permiten operaciones aritméticas entre ellos. Varias clases Comparator facilitan la ordenación para clases integradas como File, DateTime y otras. La clase y su subclase permiten la enumeración de una colección de elementos junto con una colección de índices. La clase proporciona métodos que se pueden usar para comprobar si los argumentos dados son de la clase y el tipo correctos, o dentro de un rango numérico. Una instancia mantiene una referencia, mientras que una instancia crea una referencia a otro objeto que no está fijado. [ 32 ]TimeSpanSupplierStreamSupplierValidateVariableReferenceWeakReference

Una expresión regular es un patrón que se puede usar para hacer coincidir cadenas. Para aumentar la legibilidad de los patrones en el código, la RegularExpressionclase permite el uso de nombres simbólicos encapsulados con dos puntos ( :) para conjuntos comunes. Por ejemplo, la coincidencia de una cadena que contiene solo letras, descrita típicamente como , [A-Za-z]se puede abreviar usando [:alpha:]. [ 32 ]

Otras clases ayudan a obtener información sobre el contexto del código que se está ejecutando actualmente ( RexxContext), el lenguaje Rexx o la plataforma de ejecución ( RexxInfo) y detalles de ejecución ( StackFrame) a través de símbolos de entorno. Las clases Buffery Pointerestán diseñadas específicamente para admitir la escritura de métodos y funciones en código nativo utilizando las API de C/C++. AlarmLas Tickerclases y proporcionan funciones de notificación y EventSempahorelas clases y MutexSempahoreimplementan mecanismos de sincronización para actividades multihilo. La Monitorclase permite reenviar mensajes a varios objetos de destino y la RexxQueueclase proporciona acceso similar a un objeto a colas de datos Rexx externas. [ 32 ]

Paquetes y bibliotecas externas

Mediante la ::REQUIRESdirectiva y especificando la LIBRARYopción, se pueden integrar bibliotecas externas por programa. Estas bibliotecas suelen estar organizadas en torno a funciones específicas del dominio. [ 32 ]

Se proporciona intérprete.

La biblioteca de extensión Rexx ofrece clases para leer y escribir archivos de valores separados por comas (CSV), así como para crear y procesar datos de notación de objetos JavaScript (JSON). También se incluye una biblioteca llamada "hostemenu", que emula parcialmente un entorno TSO / CMS . [ 45 ] La biblioteca nativa RxSock permite incorporar protocolos TCP/IP , [ 46 ] mientras que la biblioteca nativa RxFtp [ 47 ] proporciona específicamente acceso al protocolo de transferencia de archivos (FTP). La biblioteca nativa RxMath ofrece funciones matemáticas avanzadas como el cálculo de la raíz cuadrada, la función exponencial, el logaritmo, el seno, el coseno, la tangente, el arcoseno y el cálculo de potencias. [ 48 ]

Say rxcalcsin ( 1 ) /* salida: 0.0174524064 */:: requiere la biblioteca 'rxmath' /* cargar una biblioteca nativa */

Para Windows, ooRexx incluye el marco ooDialog que permite producir diálogos de Windows y, por lo tanto, interfaces gráficas de usuario . [ 49 ] El intérprete se entrega con varios programas de ejemplo y paquetes de funciones que demuestran el uso de este marco. [ 38 ] Para sistemas operativos compatibles con POSIX , la biblioteca de clases orxnCurses permite escribir interfaces de usuario basadas en texto utilizando la biblioteca de programación ncurses . [ 50 ] La biblioteca RxUnixSys proporciona funciones en la mayoría de los sistemas Unix para interactuar con procesos e hilos, usuarios y grupos de usuarios, archivos y sistemas de archivos y otros. [ 51 ] Muchos de estos paquetes y bibliotecas externos también son compatibles con otras implementaciones de Rexx .

No se proporciona intérprete.

También hay paquetes que deben descargarse y agregarse manualmente. Como parte del paquete Net-oo-rexx, el paquete Regex permite manejar expresiones regulares, mientras que Log4rexx proporciona un marco de registro y Oorexxshell una consola interactiva de ooRexx. [ 21 ] ooRexxUnit es un marco de prueba inspirado en JUnit que permite la ejecución de casos de prueba de ooRexx que ayudan a verificar si se cumplen las especificaciones de una aplicación. [ 52 ]

El paquete Rexx Parser proporciona un analizador de árbol de sintaxis abstracta para Rexx y ooRexx, que asigna una categoría a todos los elementos de script, mientras que el paquete Rexx Highlighter amplía el analizador y permite que el resaltado se genere como HTML, colores ANSI , LuaTex y LaTeX . [ 53 ] [ 54 ] El analizador XML de Rexx permite analizar archivos XML en un modelo en memoria y acceder a este modelo a través de una API similar a DOM . [ 55 ] También hay un analizador XML DOM sin una función de validación, que incluye un constructor DOM y métodos de acceso DOM. [ 56 ]

El paquete Mod_Rexx proporciona un módulo para Apache 2.4 que ofrece una interfaz para ooRexx en Windows, AIX y Linux, y permite procesar todas las fases de una solicitud de Apache. [ 57 ] Aunque RexxGTK no cubre todo el conjunto de herramientas GTK , encapsula la biblioteca GTK en un conjunto de clases y funciones de ooRexx para proporcionar una funcionalidad de interfaz gráfica de usuario independiente de la plataforma. [ 58 ] [ 59 ] Un paquete provisional con soporte probado para Linux está disponible para versiones más recientes de GTK. [ 56 ]

Puentes

Si bien ooRexx, en comparación con Object REXX, ya no contiene clases para la compatibilidad con SOM y WPS, ofrece interfaces de programación de aplicaciones (API) para interactuar con código escrito en C o C++ . [ 60 ] También existe una biblioteca externa que implementa un puente bidireccional de Java , que permite la interacción entre ooRexx y Java. [ 35 ] Asimismo, hay clases que permiten la interacción con bases de datos SQL y la automatización de aplicaciones de Windows. En el 36.º Simposio Rexx, se presentó un puente experimental a Python . [ 61 ]

API de C/C++

Al igual que el Rexx clásico, ooRexx incluye API para extender Rexx con aplicaciones escritas en C y viceversa. Esto permite la creación de manejadores para subcomandos utilizados en programas Rexx que se ejecutan como macros de aplicación , funciones externas que permiten una extensión directa del conjunto de funciones de ooRexx y funciones del sistema que permiten personalizar el comportamiento del intérprete. [ 60 ]

Con ooRexx 4.0.0 se han introducido API que permiten a las aplicaciones C++ extender ooRexx y viceversa. Esto incluye manejadores para métodos y funciones escritos en C++ que extienden ooRexx, ambos empaquetados como bibliotecas externas. Estas son bibliotecas de enlace dinámico en Windows o como bibliotecas compartidas en sistemas basados ​​en Unix. Una biblioteca externa se puede cargar con la ::REQUIRESdirectiva o usando la EXTERNALinstrucción de palabra clave como parte de una directiva ::ROUTINE, ::METHOD, o .::ATTRIBUTE

Java

Java Swing vía BSF4ooRexx
Interfaces gráficas de usuario multiplataforma mediante BSF4ooRexx

Utilizando las API de C++, BSF4ooRexx se desarrolló como un puente bidireccional de Java basado en Bean Scripting Framework . Este puente permite que ooRexx se comunique con objetos Java y que Java interactúe con aplicaciones Rexx. [ 62 ] [ 41 ] El puente se implementa requiriendo el paquete ooRexx BSF.CLS, que define rutinas públicas, clases y el símbolo de entorno .BSF4REXX. [ 41 ] Se proporcionan ejemplos para el uso de clases Java en conexión con AWT , Swing , JavaFX , JDBC , Java 2D y algunos otros. [ 62 ]

/* crear objeto Java */frame =. bsf ~ new ( "javax.swing.JFrame" , "Hola, mi amado mundo - ¡de ooRexx!" )frame ~ setSize ( 410 , 20 ) /* establecer ancho y alto */frame ~ visible =. true /* hacer visible el JFrame */Llamar a SysSleep 10 /* dormir durante diez segundos */:: requiere "BSF.CLS" /* obtener soporte para Java */

Basado en BSF4ooRexx, la interacción con Universal Network Objects (UNO), como se usa en OpenOffice y LibreOffice , es compatible a través del UNO.CLSpaquete. [ 63 ] El CLR.CLSpaquete junto con Jini4Net permite el uso del marco .NET . [ 64 ] La comunicación con procesos a través del middleware D-Bus en Linux es posible usando el paquete. [ 65 ] El paquete proporciona un controlador de comandos que aprovecha las clases Java2D (basadas en AWT) para la representación gráfica. [ 66 ] Basado en el controlador de comandos JDOR, el paquete experimental permite la representación de gráficos 3D usando clases JavaFX 3D. [ 67 ]DBUS.CLSJDOR.CLSJDORFX.CLS

SQL

La clase ooSQLite proporciona una interfaz para SQLite , una biblioteca integrada que implementa un motor de base de datos SQL transaccional, autónomo, sin servidor y sin configuración. [ 68 ] Permite la interacción con varias variantes de bases de datos SQL sin tener que modificar el script, pero no admite multihilo. [ 69 ]

El paquete externo Rexx/SQL permite el acceso a bases de datos SQL de diferentes proveedores a través de Open Database Connectivity (ODBC). [ 70 ] Con el objetivo de proporcionar más funcionalidad que un subconjunto de ODBC y ser seguro para subprocesos , la biblioteca Rexx MySQL proporciona un envoltorio en C para agregar soporte para MySQL . [ 71 ]

Automatización de Windows

La extensión de Windows incluye el motor de scripting Windows Script Host (WSH) que se puede usar para realizar tareas de automatización generales. También incluye compatibilidad con Object Linking and Embedding / ActiveX (OLE), lo que permite interactuar con programas de Windows a través de OLEObject. [ 72 ] La automatización OLE es un mecanismo de comunicación entre procesos desarrollado por Microsoft que se basa en un subconjunto del Component Object Model (COM). Este mecanismo permite, entre otras cosas, la invocación de funciones de programa, la consulta y configuración de atributos y la intercepción de eventos de componentes. El intérprete ooRexx viene con ejemplos que demuestran la interacción OLE con Access , Word , Excel , OpenOffice / LibreOffice , Active Directory , WMI y otros programas. Además, se incluye un programa de utilidad para buscar objetos OLE disponibles. [ 38 ]

exc = . OLEObject ~ new ( "Excel.Application" ) /* crear objeto para Excel */exc ~ visible = . verdadero /* hacer visible Excel */Hoja de cálculo = exc ~ Libros de trabajo ~ Agregar ~ Hojas de cálculo [ 1 ] /* agregar hoja de cálculo */Hoja de cálculo ~ celdas ( 1 , 1 ) ~ Valor = "Primera celda" /* insertar cadena en la celda */

Además de la compatibilidad con OLE, la extensión de Windows permite la interacción con el administrador de programas de Windows, el registro de eventos del sistema , el portapapeles y el registro, así como consultar, editar e interactuar con ventanas, menús o submenús. [ 72 ]

Notas

  1. Incluye interfaces con el Modelo de Objetos del Sistema (SOM) y el Entorno de Trabajo (WPS).
  2. Excluyendo los paquetes SOM y WPS
  3. A partir de la versión 5.0.0, ooRexx tiene las::ANNOTATE,::ATTRIBUTE,::CLASS,::CONSTANT,::METHOD,::OPTIONS,::REQUIRES,::RESOURCEy::ROUTINE.

Véase también

Referencias

  1. 1 2 3 "X3.274-1996 Instituto Nacional Estadounidense de Estándares para el Lenguaje de Programación Rexx" (PDF) .
  2. 1 2 3 4 Fosdick, Howard (2024). Rexx Programmer's Reference (PDF) (2.ª ed.). Rexx Language Association. ISBN  979-898611913-7.
  3. "7 razones por las que Rexx sigue siendo importante" . SmartBear.com . Consultado el 19 de junio de 2024 .
  4. 1 2 "IBM Object REXX – EDM2" . www.edm2.com . Consultado el 19 de junio de 2024 .
  5. Nash, Simon C. (1990-06-11). "REXX orientado a objetos" (PDF) . Actas del Simposio REXX para desarrolladores y usuarios : 76–100 .
  6. Nash, Simon C. (2009-05-21). "Una retrospectiva de Object Rexx" (PDF) . Actas del 20º Simposio del Lenguaje Rexx .
  7. 1 2 "IBM Object REXX para OS/2 – EDM2" . www.edm2.com . Consultado el 19 de junio de 2024 .
  8. 1 2 "IBM Object REXX ahora se ejecuta en Windows NT y Windows 95" . IBM. 25 de febrero de 1997.
  9. Schweizer, Manfred; Berger, Uwe (2005-04-21). "De Object REXX a ooRexx" (PDF) . Actas del 16º Simposio del Lenguaje Rexx .
  10. 1 2 "IBM Object REXX para AIX: lenguaje de scripting orientado a objetos para programadores principiantes y avanzados" . IBM. 30 de marzo de 1999.
  11. 1 2 "IBM Object REXX para Windows V2R1: Programación orientada a objetos para usuarios principiantes y avanzados" . IBM. 2001-03-20.
  12. ↑ ¿ Dónde quedó la compatibilidad con SOM en la versión 4.0.0?
  13. "SOM y Object REXX – EDM2" . www.edm2.com . Consultado el 11 de diciembre de 2024 .
  14. Willis Boughton (2004). "SOM y Object REXX" . EDM/2 . Consultado el 2 de febrero de 2014 .
  15. "Acceso a objetos de Workplace Shell". Referencia de Object REXX . IBM.
  16. "¿ArcaOS incluye soporte para REXX?" . Consultado el 3 de septiembre de 2020 .
  17. "Retirada de software y discontinuación de servicio: IBM Object REXX" . IBM. 12 de octubre de 2004.
  18. "RexxLA – Simposios Rexx" . www.rexxla.org . Consultado el 17 de mayo de 2024 .
  19. "ooRexx (Open Object Rexx) - Explore /oorexx en SourceForge.net" . sourceforge.net . Consultado el 18 de mayo de 2024 .
  20. "ooRexx (Open Object Rexx) - Consultar /oorexx-docs en SourceForge.net" . sourceforge.net . Consultado el 18 de mayo de 2024 .
  21. 1 2 3 "Net-oo-rexx Readme" . 1 de diciembre de 2024.
  22. Flatscher, Rony G. (2023). "El complemento ooRexxPlugin 2.2 de IntelliJ IDEA para Rexx y ooRexx 5.0" (PDF) .
  23. Geulig, Thomas (2012). "Archivo de sintaxis de Vim: Rexx" .
  24. 1 2 3 4 "ooRexx News" . Sourceforge . Consultado el 18 de mayo de 2024 .
  25. Open Object Rexx Reference Versión 3.0.0 Edición (PDF) . RexxLA. 24 de marzo de 2005. Consultado el 18 de mayo de 2024 .
  26. "ooRexx 4.0.0: Léame" (PDF) . Consultado el 18 de mayo de 2024 .
  27. "ooRexx 4.1.0: Notas de la versión" . Consultado el 18 de mayo de 2024 .
  28. "ooSQLite: Léame" . Consultado el 18 de mayo de 2024 .
  29. "ooRexx 4.2.0: Cambios" . Consultado el 18 de mayo de 2024 .
  30. "ooRexx 5.0.0: Cambios" . Consultado el 18 de mayo de 2024 .
  31. Flatscher, Rony G. (2025). "Actualización de la versión OoRexx 5.1.0" (PDF) . Actas del 36º Simposio Internacional Rexx .
  32. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). Documentación de ooRexx 5.1.0 Referencia de Open Object Rexx (PDF) . RexxLA.
  33. Flatscher, Rony G. (2026). "El lanzamiento de ooRexx 5.2" (PDF) . Actas del 37º Simposio Internacional Rexx .
  34. 1 2 3 Cowlishaw, Mike (1987). "El diseño del lenguaje REXX" . ACM SIGPLAN Notices . 22 (2): 26– 35. doi : 10.1145/24686.24687 .
  35. 1 2 3 4 Flatscher, Rony G.; Winkler, Till. "Empleando el paradigma de mensajes para facilitar el aprendizaje de conceptos y programación orientados a objetos" (PDF) . En 2024 47.ª Convención MIPRO de TIC y Electrónica (MIPRO) : 1244–1249 .
  36. 1 2 3 Winkler, Till; Flatscher, Rony G. "Carga cognitiva en la enseñanza de la programación: aliviar la carga de los principiantes con REXX" (PDF) . Conferencia centroeuropea sobre información y sistemas inteligentes .
  37. Stefik, Andreas; Siebert, Susanna (2013). "Una investigación empírica sobre la sintaxis de los lenguajes de programación" . ACM Transactions on Computing Education . 13 (4): 1– 40. doi : 10.1145/2534973 .
  38. 1 2 3 4 5 6 7 8 9 10 11 Ashley, W. David; Flatscher, Rony G.; Hessling, Marcos; McGuire, Rick; Peedín, Lee; Sims, Oliver; Wolfers, Jon (2025). Guía del programador de documentación de ooRexx 5.1.0 (PDF) . RexxLA.
  39. "ooRexx (Open Object Rexx) / Discusión / Ayuda: "... y ejecutará programas REXX clásicos sin modificaciones"" . sourceforge.net . Consultado el 17 de junio de 2025 .
  40. 1 2 Barmwater, Gil (2025). "Personalización de ooRexx" (PDF) . Actas del 35º Simposio Internacional Rexx .
  41. 1 2 3 Flatscher, Rony G. (2009). "La edición de 2009 de BSF4Rexx Parte I" (PDF) . XX Simposio del lenguaje Rexx . RexxLA.
  42. 1 2 3 Flatscher, Rony G.; Winkler, Till (2024). "Diseño de una clase TraceObject para mejorar la monitorización en tiempo de ejecución de aplicaciones ooRexx" . Actas del 7.º Taller Internacional de ACM sobre Verificación y Monitorización en la Ejecución en Tiempo de Ejecución . págs. 19–24 . doi : 10.1145/3679008.3685543 . ISBN  979-8-4007-1119-0.
  43. Flatscher, Rony G. (2025). "Actualización de la versión OoRexx 5.1.0" (PDF) . Actas del 36º Simposio Internacional Rexx .
  44. "ooRexx Debugger" . SourceForge . 26/01/2025 . Consultado el 02/02/2025 .
  45. Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Rexx Extensions Library Reference (PDF) . RexxLA.
  46. Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 RxSock TCP/IP Socket Functions Reference (PDF) . RexxLA.
  47. Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 RxFtp Class Library Reference (PDF) . RexxLA.
  48. ^ Ashley, W.David; Flatscher, Rony G.; Hessling, Marcos; McGuire, Rick; Peedín, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentación 5.1.0 Referencia de funciones matemáticas de RxMath (PDF) . RexxLA.
  49. ^ Ashley, W. David; Flatscher, Rony G.; McGuire, Rick; Peedín, Lee; Sims, Oliver; Wolfers, Jon (2025). Documentación de ooRexx 4.2.4 Referencia de ooDialog (PDF) . RexxLA.
  50. ^ Ashley, W. David; Flatscher, Rony G.; Hessling, Marcos; McGuire, Rick; Peedín, Lee; Sims, Oliver; Steinböck, Erich; Wolfers, Jon (2025). ooRexx Documentación 5.1.0 Referencia de la biblioteca de clases nCurses (PDF) . RexxLA.
  51. Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Steinböck, Erich; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Unix Extensions Function Reference (PDF) . RexxLA.
  52. Flatscher, Rony G. (2006). "ooRexxUnit: Un marco de pruebas compatible con JUnit para programas ooRexx" . El Simposio Internacional Rexx de 2006 .
  53. "El analizador Rexx" . rexx.epbcn.com . Consultado el 4 de febrero de 2025 .
  54. "El resaltador Rexx" . rexx.epbcn.com . Consultado el 4 de febrero de 2025 .
  55. Armstrong, Andrew (2024-12-02), abend0c1/rexxxmlparser , consultado el 14-02-2025
  56. 1 2 "(oo)Rexx - Muestras de trabajo en progreso" . www.idenburg.net . Consultado el 30 de abril de 2026 .
  57. "Mod_rexx" . SourceForge . 17 de enero de 2022. Consultado el 4 de febrero de 2025 .
  58. "ooRexx (Open Object Rexx) - Explore /RexxGTK en SourceForge.net" . sourceforge.net . Consultado el 30 de abril de 2026 .
  59. Ashley, David (2008). "Open Object RexxGTK - Interfaz gráfica de usuario independiente de la plataforma" (PDF) . 19º Simposio del lenguaje Rexx .
  60. 1 2 Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Application Programming Interfaces (PDF) . RexxLA.
  61. Kuzugüdenli, Kaan (2025). "Python para ooRexx" (PDF) . Actas del 36º Simposio Internacional Rexx .
  62. 1 2 "BSF4ooRexx" . sourceforge.net . 12 de agosto de 2024. Consultado el 10 de noviembre de 2024 .
  63. Waglechner, Christoph (2009). Automatización de OpenOffice.org utilizando el lenguaje de scripting ooRexx mediante ejemplos seleccionados de Nutshell por Andrew Pitonyak (PDF) .
  64. Baginski, Adrian (2016). Un libro de recetas .NET usando ooRexx.NET (PDF) .
  65. Lagler, Richard (2015). Enlace de lenguaje D-Bus para ooRexx: una introducción a los ejemplos de Nutshell (PDF) .
  66. Deger, Elif (2025). "BSF4ooRexx850 JDOR: Java 2D Drawing for ooRexx" (PDF) . Actas del 36º Simposio Internacional Rexx .
  67. Schaller, Philip (2025). "JDORFX: Proporcionando gráficos 3D a ooRexx" (PDF) . Actas del 36º Simposio Internacional Rexx .
  68. ^ Ashley, W.David; Flatscher, Rony G.; McGuire, Rick; Miesfeld, Mark; Peedín, Lee; Sims, Oliver; Wolfers, Jon (2025). Documentación de ooRexx 1.0.1 Referencia de ooSQLite (PDF) . RexxLA.
  69. "OREXX/SQL Object Framework – EDM2" . www.edm2.com . Consultado el 11 de diciembre de 2024 .
  70. "Rexx/SQL" . SourceForge . 19/06/2013 . Consultado el 03/02/2025 .
  71. "REXX MySQL Library" . SourceForge . 2013-04-25 . Consultado el 2025-02-03 .
  72. 1 2 Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Windows Extensions Reference (PDF) . RexxLA.

Lecturas adicionales

  • Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). Documentación de ooRexx 5.1.0 Referencia de Open Object Rexx (PDF) . RexxLA.
  • Ashley, W. David; Flatscher, Rony G.; Hessling, Marcos; McGuire, Rick; Peedín, Lee; Sims, Oliver; Wolfers, Jon (2025). Guía del programador de documentación de ooRexx 5.1.0 (PDF) . RexxLA.
  • Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Windows Extensions Reference (PDF) . RexxLA.
  • Ashley, W. David; Flatscher, Rony G.; Hessling, Mark; McGuire, Rick; Peedin, Lee; Sims, Oliver; Wolfers, Jon (2025). ooRexx Documentation 5.1.0 Application Programming Interfaces (PDF) . RexxLA.
  • Fosdick, Howard (2024). Rexx Programmer's Reference (PDF) (2.ª  ed.). Rexx Language Association. ISBN 979-898611913-7.
  • Flatscher, Rony G. (2024). Introducción a Rexx y ooRexx: De Rexx a Open Object Rexx (ooRexx) . Mijnbestseller. ISBN 978-9403755038.
  • Asociación Lingüística Rexx
  • Documentación de Open Object Rexx 5.1.0
  • Open Object Rexx en SourceForge
  • Sitio web de Open Object Rexx
  • Open Object Rexx en Rosetta Code
  • BSF4ooRexx en SourceForge
  • Depurador ooRexx en SourceForge
  • Net-oo-Rexx
Obtenido de " https://en.wikipedia.org/w/index.php?title=Object_REXX&oldid=1354997070 "