Rexx - Guia Rápido

Rexx (Restructured Extended Executor)foi projetado para ser uma linguagem de script. Seu objetivo é tornar o script o mais fácil, rápido, confiável e livre de erros possível. Muitas linguagens de programação são projetadas para compatibilidade com linguagens mais antigas e são escritas para públicos ou plataformas específicas. Rexx ignora objetivos estranhos. Ele foi projetado desde o primeiro dia para ser poderoso, mas fácil de usar.

Rexx foi projetado e implementado pela primeira vez, em linguagem assembly, como um projeto de 'tempo próprio' entre 20 th março 1979 e meados de 1982 por Mike Cowlishaw da IBM, originalmente como uma linguagem de script de programação para substituir as línguasEXEC and EXEC 2. Foi projetado para ser ummacro or scripting languagepara qualquer sistema. Como tal, Rexx é considerado um precursor do Tcl e do Python. O Rexx também foi projetado por seu criador para ser uma versão simplificada e mais fácil de aprender da linguagem de programação PL / I.

Características do Rexx

Rexx como uma linguagem de programação tem os seguintes recursos principais -

  • Sintaxe simples

  • A capacidade de rotear comandos para vários ambientes

  • A capacidade de oferecer suporte a funções, procedimentos e comandos associados a um ambiente de chamada específico.

  • Uma pilha embutida, com a capacidade de interoperar com a pilha do host, se houver.

  • Pequeno conjunto de instruções contendo apenas duas dúzias de instruções

  • Sintaxe de forma livre

  • Tokens que não diferenciam maiúsculas de minúsculas, incluindo nomes de variáveis

  • Base de string de caracteres

  • Tipos de dados dinâmicos, sem declarações

  • Sem palavras-chave reservadas, exceto no contexto local

  • Não inclui instalações de arquivo

  • Precisão numérica arbitrária

  • Aritmética decimal, ponto flutuante

  • Uma rica seleção de funções integradas, especialmente string e processamento de texto

  • Gerenciamento automático de armazenamento

  • Proteção contra colisões

  • Estruturas de dados endereçáveis ​​de conteúdo

  • Matrizes associativas

  • Acesso direto aos comandos e instalações do sistema

  • Tratamento de erros simples e rastreamento e depurador integrados

  • Poucas limitações artificiais

  • Instalações de E / S simplificadas

O site oficial da Rexx é www.oorexx.org

Antes de começar a trabalhar no Rexx, você precisa se certificar de que possui uma versão totalmente funcional do Rexx em execução em seu sistema. Este capítulo explicará a instalação do Rexx e sua configuração subsequente em uma máquina Windows para começar a usar o Rexx.

Certifique-se de que os seguintes requisitos do sistema sejam atendidos antes de prosseguir com a instalação.

Requisitos de sistema

Memória 2 GB de RAM (recomendado)
Espaço em disco Sem requisitos mínimos. De preferência, ter espaço de armazenamento suficiente para armazenar os programas que serão criados com Rexx.
Versão do sistema operacional Rexx pode ser instalado em Windows, Ubuntu / Debian, Mac OS X.

Baixando Rexx

Para baixar o Rexx, você deve usar o seguinte URL - https://www.oorexx.org/download.html

Esta página possui uma variedade de downloads para várias versões do Rexx, conforme mostrado na imagem a seguir.

Clique em 'ooRexx install files' na tabela com o cabeçalho da versão 4.2.0.

Depois disso, você será redirecionado para a página seguinte.

Clique no ooRexx-4.2.0.windows.x86_64.exe para baixar o 64-bitversão do software. Discutiremos sobre a instalação do software no capítulo seguinte.

As etapas a seguir irão explicar em detalhes como Rexx pode ser instalado em um sistema Windows.

Step 1- Inicie o instalador baixado na seção anterior. Depois que o instalador iniciar, clique no botão Executar.

Step 2 - Clique no próximo botão na tela seguinte para prosseguir com a instalação.

Step 3 - Clique no I Agree botão para continuar.

Step 4 - Aceite o default components e clique no botão seguinte.

Step 5 - Escolha o local de instalação e clique no botão Avançar.

Step 6 - Aceite os processos padrão que serão instalados e clique no botão Avançar.

Step 7 - Escolha as associações de arquivo padrão e clique no botão Avançar.

Step 8 - Clique nas caixas de seleção de enviar itens Rexx para os executáveis ​​e, em seguida, clique no botão Avançar, conforme mostrado na imagem a seguir.

Step 9- Na próxima tela, escolha o editor para trabalhar com arquivos Rexx. Mantenha o bloco de notas como opção padrão. Aceite também a extensão padrão para cada arquivo Rexx.

Step 10 - Aceite as configurações padrão na tela a seguir e clique no botão Avançar para prosseguir com a instalação.

Step 11 - Por fim, clique no botão Instalar para prosseguir com a instalação.

Step 12 - Assim que a instalação for concluída, você precisa clicar no botão Avançar para prosseguir.

Step 13 - Clique no botão Concluir para concluir a instalação.

Neste capítulo, discutiremos como instalar plug-ins em popular IDE’s (Integrated Development Environment). Rexx como uma linguagem de programação também está disponível em IDE populares, comoEclipse. Vejamos como podemos obter os plugins necessários nesses IDE, para que você tenha mais opções para trabalhar com o Rexx.

Instalação em Eclipse

Para fazer uma instalação sem problemas do Rexx no Eclipse, você precisará seguir as etapas a seguir.

Step 1 - Abra o Eclipse e clique no item de menu, Help → Eclipse Marketplace como mostrado na imagem a seguir.

Step 2 - Na próxima caixa de diálogo, insira Rexx nos critérios de pesquisa e clique no botão de pesquisa.

Uma vez feito isso, clique no botão Instalar.

Step 3 - Clique no botão Confirmar para continuar com a instalação dos recursos.

Step 4- O Eclipse fará o download dos arquivos necessários para iniciar a instalação. Uma vez feito isso, o Eclipse solicitará a aceitação dos contratos de licença. Clique em aceitar os contratos de licença e, em seguida, clique no botão Concluir conforme mostrado na imagem a seguir.

O Eclipse começará a instalar o software em segundo plano.

Step 5- Você provavelmente receberá um aviso de segurança (conforme mostrado na imagem a seguir). Clique no botão OK para prosseguir.

Step 6- Você será solicitado a reiniciar o Eclipse assim que as atualizações forem instaladas. Clique em Sim para reiniciar o Eclipse.

Para entender a sintaxe básica do Rexx, vamos primeiro examinar um programa simples Hello World.

Exemplo

/* Main program */ 
say "Hello World"

Pode-se ver como o programa hello world é simples. É uma linha de script simples usada para executar o programa Hello World.

As seguintes coisas precisam ser observadas sobre o programa acima -

  • o say command é usado para enviar um valor para o console.

  • o /* */ é usado para comentários no Rexx.

O resultado do programa acima será -

Hello World

Forma Geral de uma Declaração

No Rexx, vamos ver uma forma geral de um programa. Dê uma olhada no exemplo a seguir.

/* Main program */ 
say add(5,6) 
exit 
add: 
parse arg a,b 
return a + b

O resultado do programa acima será -

11

Vamos repassar o que entendemos do programa acima -

  • Adicionar é uma função definida para adicionar 2 números.

  • No programa principal, os valores de 5 e 6 são usados ​​como parâmetros para a função add.

  • A palavra-chave exit é usada para sair do programa principal. Isso é usado para diferenciar o programa principal da função add.

  • A função add é diferenciada com o símbolo ':'.

  • A instrução parse é usada para analisar os argumentos recebidos.

  • Finalmente, a instrução return é usada para retornar a soma dos valores numéricos.

Sub-rotinas e funções

No Rexx, o código é normalmente dividido em sub-rotinas e funções. Sub-rotinas e funções são usadas para diferenciar o código em diferentes unidades lógicas. A principal diferença entre sub-rotinas e funções é que as funções retornam um valor, enquanto as sub-rotinas não.

Abaixo está um exemplo de diferença chave entre uma sub-rotina e uma função para uma implementação de adição -

Implementação de Função

/* Main program */ 
say add(5,6) 
exit 
add: 
parse arg a,b 
return a + b

Implementação de subrotina

/* Main program */ 
add(5,6) 
exit 
add: 
parse arg a,b 
say a + b

A saída de ambos os programas será o valor 11.

Executando Comandos

Rexx pode ser usado como uma linguagem de controle para uma variedade de sistemas baseados em comandos. A forma como o Rexx executa os comandos nesses sistemas é a seguinte. Quando Rexx encontra uma linha de programa que não é uma instrução nem uma atribuição, ele trata essa linha como uma expressão de string que deve ser avaliada e então passada para o ambiente.

Um exemplo é o seguinte -

Exemplo

/* Main program */ 
parse arg command 
command "file1" 
command "file2" 
command "file3" 
exit

Cada uma das três linhas semelhantes neste programa é uma expressão de string que adiciona o nome de um arquivo (contido nas constantes de string) ao nome de um comando (fornecido como um parâmetro). A string resultante é passada ao ambiente para ser executada como um comando. Quando o comando termina, a variável "rc" é definida como o código de saída do comando.

O resultado do programa acima é o seguinte -

sh: file1: command not found
     3 *-* command "file1" 
       >>>   " file1"
       +++   "RC(127)"
sh: file2: command not found
     4 *-* command "file2" 
       >>>   " file2"
       +++   "RC(127)"
sh: file3: command not found
     5 *-* command "file3" 
       >>>   " file3"
       +++   "RC(127)"

Palavras-chave em Rexx

A sintaxe livre do REXX implica que alguns símbolos são reservados para uso do processador de linguagem em determinados contextos.

Dentro de instruções específicas, alguns símbolos podem ser reservados para separar as partes da instrução. Esses símbolos são chamados de palavras-chave. Exemplos de palavras-chave REXX são osWHILE in a DO instruction, e as THEN (que atua como um terminador de cláusula, neste caso) após um IF or WHEN clause.

Além desses casos, apenas símbolos simples que são o primeiro token em uma cláusula e que não são seguidos por um "=" ou ":" são verificados para ver se são palavras-chave de instrução. Você pode usar os símbolos livremente em outras partes das cláusulas, sem que sejam considerados palavras-chave.

Comentários em Rexx

Os comentários são usados ​​para documentar seu código. Comentários de linha única são identificados usando / * * / em qualquer posição na linha.

Um exemplo é o seguinte -

/* Main program */
/* Call the add function */
add(5,6)

/* Exit the main program */
exit add:

/* Parse the arguments passed to the add function */ parse arg a,b
/* Display the added numeric values */
say a + b

Os comentários também podem ser escritos entre uma linha de código, conforme mostrado no programa a seguir -

/* Main program */ 
/* Call the add function */ 
add(5,6) 

/* Exit the main program */ 
exit 
add: 
parse    /* Parse the arguments passed to the add function */ 
arg a,b 

/* Display the added numeric values */ 
say a + b

O resultado do programa acima será -

11

Você também pode ter várias linhas em um comentário, conforme mostrado no seguinte programa -

/* Main program 
The below program is used to add numbers 
Call the add function */ 
add(5,6) 
exit 
add: 
parse arg a,b 
say a + b

O resultado do programa acima será -

11

Em qualquer linguagem de programação, você precisa usar várias variáveis ​​para armazenar vários tipos de informações. As variáveis ​​nada mais são do que locais de memória reservados para armazenar valores. Isso significa que, ao criar uma variável, você reserva algum espaço na memória para armazenar o valor associado a essa variável.

Você pode gostar de armazenar informações de vários tipos de dados como String, Character, Wide Character, Integer, Floating Point, Boolean, etc. Com base no tipo de dados de uma variável, o sistema operacional aloca memória e decide o que pode ser armazenado no reservado memória.

Tipos de dados integrados

Rexx oferece uma grande variedade de tipos de dados integrados. A seguir está uma lista de tipos de dados que são definidos no Rexx.

  • Integer- Uma string numérica que não contém um ponto decimal ou identificador de expoente. O primeiro personagem pode sera plus (+) or minus (-) sign. O número representado deve estar entre -2147483648 e 2147483647, inclusive.

  • Big Integer- Uma sequência de números que não contém um ponto decimal ou um identificador de expoente. O primeiro caractere pode ser um sinal de mais (+) ou menos (-). O número representado deve estar entre -9223372036854775808 e 2147483648, inclusive, ou entre 2147483648 e 9223372036854775807.

  • Decimal - Será de um dos seguintes formatos -

    • Uma string numérica que contém um ponto decimal, mas nenhum identificador de expoente. op representa a precisão e srepresenta a escala do número decimal que a string representa. O primeiro caractere pode ser um sinal de mais (+) ou menos (-).

    • Uma seqüência de números que does not contain a decimal pointou um identificador de expoente. O primeiro caractere pode ser um sinal de mais (+) ou menos (-). O número representado é menor que -9223372036854775808 ou maior que 9223372036854775807.

  • Float- Uma string que representa um número em notação científica. A string consiste em uma série de números seguidos por um identificador de expoente (um E ou e seguido por um sinal opcional de mais (+) ou menos (-) e uma série de números). A string pode começar com um sinal de mais (+) ou menos (-).

  • String - Uma sequência normal de caracteres.

A seguir estão alguns exemplos de como cada tipo de dados pode ser usado. Novamente, cada tipo de dados será discutido em detalhes nos capítulos subsequentes. Isso é apenas para deixá-lo atualizado com uma breve descrição dos tipos de dados mencionados acima.

Inteiro

Um exemplo de como o tipo de dados de número pode ser usado é mostrado no programa a seguir. Este programa mostra a adição de 2 inteiros.

Example

/* Main program 
The below program is used to add numbers 
Call the add function */ 
add(5,6)  

exit 
add:  

parse arg a,b 
say a + b

O resultado do programa acima será -

11

Grande Inteiro

O programa a seguir mostra a capacidade do Rexx de lidar com números inteiros grandes. Este programa mostra como adicionar 2 números inteiros grandes.

Example

/* Main program 
The below program is used to add numbers 
Call the add function */ 
add(500000000000,6000000000000000000000)  

exit 
add:  

parse arg a,b 
say a + b

O resultado do programa acima será -

6.00000000E+21

Decimal

O programa a seguir mostra a capacidade do Rexx de lidar com números decimais. Este programa mostra como adicionar 2 números decimais.

Example

/* Main program 
The below program is used to add numbers 
Call the add function */ 
add(5.5,6.6)  

exit 
add:  

parse arg a,b 
say a + b

O resultado do programa acima será -

12.1

Flutuador

O exemplo a seguir mostra casos como um número pode funcionar como um float.

Example

/* Main program 
The below program is used to add numbers 
Call the add function */ 
add(12E2,14E4)  

exit 
add:  

parse arg a,b 
say a + b

O resultado do programa acima será -

141200

Corda

Um exemplo de como o tipo de dados Tupla pode ser usado é mostrado no programa a seguir.

Aqui estamos definindo um Tuple Pque tem 3 termos. otuple_size é uma função embutida definida no Rexx que pode ser usada para determinar o tamanho da tupla.

Example

/* Main program */ 
display("hello")  

exit 
display:  

parse arg a 
say a

O resultado do programa acima será -

hello

No Rexx, todas as variáveis ​​são associadas à instrução '='. Os nomes das variáveis ​​às vezes são chamados de símbolos. Eles podem ser compostos de letras, dígitos e caracteres como '. ! ? _'. Um nome de variável que você cria não deve começar com um dígito ou ponto. Um nome de variável simples não inclui um ponto. Um nome de variável que inclui um período é chamado de variável composta e representa uma matriz ou tabela.

A seguir estão os tipos básicos de variáveis ​​no Rexx que também foram explicados no capítulo anterior -

  • Integers- Isso é usado para representar um número inteiro ou um ponto flutuante. Um exemplo disso é 10.

  • Big integers - Isso representa um grande valor inteiro.

  • Decimal - Um valor decimal é uma string numérica que contém um ponto decimal, mas nenhum identificador de expoente.

  • Float - Um valor flutuante é uma string que representa um número na notação científica.

  • String - Uma série de caracteres define uma string em Rexx.

Diferentes tipos de funções variáveis

Nesta seção, discutiremos com relação às várias funções que uma variável pode executar.

Declarações de variáveis

A sintaxe geral de definição de uma variável é mostrada a seguir -

var-name = var-value

Onde

  • var-name - Este é o nome da variável.

  • var-value - Este é o valor vinculado à variável.

O programa a seguir é um exemplo de declaração de variável -

Example

/* Main program */ 
X = 40 
Y = 50 
Result = X + Y 
say Result

No exemplo acima, temos 2 variáveis, uma é X que está ligado ao valor 40 e o próximo é Y que está vinculado ao valor de 50. Outra variável chamada Resultado está ligada à adição deX and Y.

O resultado do programa acima será o seguinte -

90

Nomeando Variáveis

Os nomes das variáveis ​​às vezes são chamados de símbolos. Eles podem ser compostos de letras, dígitos e caracteres como '. ! ? _ '. Um nome de variável que você cria não deve começar com um dígito ou ponto.

Se ainda não foi atribuído um valor a uma variável, ela é chamada de não inicializada. O valor de uma variável não inicializada é o nome da própria variável em letras maiúsculas.

Um exemplo de uma variável não atribuída é o seguinte -

Example

/* Main program */ 
unassignedvalue 
say unassignedvalue

Se você executar o programa acima, obterá a seguinte saída -

UNASSIGNEDVALUE
sh: UNASSIGNEDVALUE: command not found
     2 *-* unassignedvalue 
       >>>   "UNASSIGNEDVALUE"
       +++   "RC(127)"

As variáveis ​​podem ter valores atribuídos mais de uma vez. O programa abaixo mostra como o valor de X pode ser atribuído a um valor várias vezes.

Example

/* Main program */ 
X = 40 
X = 50 
say X

O resultado do programa acima será o seguinte -

50

Variáveis ​​de impressão

Os valores das variáveis ​​são impressos usando o saycomando. A seguir está um exemplo de impressão de uma variedade de variáveis.

Example

/* Main program */ 
X = 40 

/* Display an Integer */ 
say X 
Y = 50.5 

/* Display a Float */ 
say Y 
Z = "hello" 

/* Display a string */ 
say Z

O resultado do programa acima será o seguinte -

40 
50.5 
hello

Um operador é um símbolo que informa ao compilador para executar manipulações matemáticas ou lógicas específicas.

A Rexx tem vários tipos de operadores que também são explicados em detalhes a seguir -

  • Operadores aritméticos
  • Operadores relacionais
  • Operadores lógicos
  • Operadores bit a bit

Operadores aritméticos

A linguagem Rexx suporta os Operadores Aritméticos normais como qualquer outra linguagem. A seguir estão os operadores aritméticos disponíveis na Rexx.

Mostrar exemplo

Operador Descrição Exemplo
+ Adição de dois operandos 1 + 2 dará 3
- Subtrai o segundo operando do primeiro 1 - 2 dará -1
Multiplicação de ambos os operandos 2 ∗ 2 dará 4
/ Divisão do numerador por denominador 2/2 dará 1
// Restante da divisão do primeiro número pelo segundo 3 // 2 resultará em 1
% O componente div executará a divisão e retornará o componente inteiro. 3% 2 dará 1

Operadores Relacionais

Operadores relacionais permitem a comparação de objetos. A seguir estão os operadores relacionais disponíveis no Rexx. No Rexx, o valor verdadeiro é denotado por 1 e o valor falso é denotado por 0.

Mostrar exemplo

Operador Descrição Exemplo
== Testa a igualdade entre dois objetos 2 = 2 dará 1
< Verifica se o objeto esquerdo é menor que o operando direito. 2 <3 dará 1
= < Verifica se o objeto esquerdo é menor ou igual ao operando direito. 2 = <3 dará 1
> Verifica se o objeto esquerdo é maior que o operando direito. 3> 2 dará 1
> = Verifica se o objeto esquerdo é maior ou igual ao operando direito. 3> 2 dará 1

Operadores lógicos

Operadores lógicos são usados ​​para avaliar expressões booleanas. A seguir estão os operadores lógicos disponíveis no Rexx.

Mostrar exemplo

Operador Descrição Exemplo
E Este é o operador lógico “e” 1 ou 1 dará 1
| Este é o operador lógico “ou” 1 ou 0 dará 1
\ Este é o operador lógico “não” \ 0 dará 1
&& Este é o operador “ou” exclusivo lógico 1 && 0 dará 1

Operadores bit a bit

O Groovy fornece quatro operadores bit a bit. Abaixo estão os operadores bit a bit disponíveis no Groovy.

Mostrar exemplo

Sr. Não. Operador e descrição
1

bitand

Este é o operador bit a bit “e”

2

bitor

Este é o operador bit a bit “ou”

3

bitxor

Este é o bit a bit “xor” ou Exclusivo ou operador

operador precedente

A tabela a seguir mostra a precedência do operador para os operadores Rexx em ordem de prioridade decrescente de sua precedência.

Operadores Precedência
Operadores de prefixo + - \
Adição e subtração + -
Operadores de comparação = ==> <> = <=
E lógico E
OR lógico |
EXCLUSIVO OU &&

Arrays em qualquer linguagem de programação permitem agrupar uma lista de valores do mesmo tipo. O uso de matrizes permite a você construir uma lista de tipos semelhantes de valores que sãosortable, searchable e pode ser easily manipulated. Rexx também permite definir matrizes. Essas matrizes podem ser unidimensionais ou multidimensionais.

As matrizes Rexx podem ser esparsas. Ou seja, nem toda posição do array deve ter um valor ou mesmo ser inicializada. Pode haver posições de array vazias, ou slots, entre aqueles que contêm elementos de dados. Ou os arrays podem ser densos, nos quais todos os slots de array consecutivos contêm elementos de dados.

Em muitas linguagens de programação, você deve se preocupar com o que é o subscrito da primeira entrada em uma tabela. O primeiro subscrito numérico é 0 ou 1? No Rexx, o primeiro subscrito é o que você usa! Portanto, insira o primeiro elemento da matriz na posição 0 ou 1 como preferir.

array_name.0 = ‘first element’

ou

array_name.1 = ‘first element’

Vejamos as diferentes operações disponíveis para matrizes.

Criação de matrizes

Os arrays são criados com a mesma convenção de nomenclatura que é usada para variáveis ​​no Rexx.

A sintaxe geral para criar matrizes é a seguinte -

Arrayname.index = value

Onde

  • Arrayname - Este é o nome fornecido para a matriz.

  • Index - Esta é a posição do índice na matriz para se referir a um elemento específico.

  • Value - Este é o valor atribuído ao elemento de índice na matriz.

Um exemplo de declaração de array é o seguinte -

Example

/* Main program */ 
list.1 = 0 
list.2 = 0 
list.3 = 0

Os seguintes pontos devem ser observados sobre o programa acima -

  • O nome do array é dado como lista
  • Existem 3 elementos da matriz que são inicializados com o valor 0.

Atribuição de Valores a um Elemento Array

Os valores podem ser reatribuídos aos elementos do array da mesma maneira que os elementos do array são inicializados.

O programa a seguir é um exemplo de valores que podem ser atribuídos a vários valores de índice de uma matriz existente.

/* Main program */ 
list.1 = 0 
list.2 = 0 
list.3 = 0 

/* Assigning new values to the array*/ 
list.1 = 10 
list.3 = 30

Exibindo Valores de uma Matriz

Os valores de uma matriz podem ser exibidos referindo-se à posição de índice do elemento da matriz. O exemplo a seguir mostra como acessar vários elementos da matriz.

Example

/* Main program */ 
list.1 = 0 
list.2 = 0 
list.3 = 0 

/* Assigning new values to the array*/ 
list.1 = 10 
list.3 = 30 
say list.1 
say list.2 
say list.3

O resultado do programa acima será o seguinte -

10
0
30

Copiando matrizes

Todos os elementos de um array podem ser copiados para outro array. A sintaxe geral disso é a seguinte -

Newarray. = sourcearray.

Onde

  • Newarray - Este é o novo array no qual os elementos precisam ser copiados.

  • Sourcearray - Esta é a matriz de origem da qual os elementos precisam ser copiados.

Um exemplo de como as operações de cópia para matrizes podem ser realizadas é mostrado no seguinte programa -

Example

/* Main program */ 
list.1 = 0 
list.2 = 0 
list.3 = 0 

/* Assigning new values to the array*/ 
list.1 = 10 
list.3 = 30 
listnew. = list. 

say listnew.1 
say listnew.2 
say listnew.3

O resultado do programa acima será -

10
0
30

Iterando através de elementos da matriz

Os elementos de uma matriz também podem ser iterados usando as instruções iterativas disponíveis no Rexx. Um exemplo de como isso pode ser feito é o seguinte -

Example

/* Main program */ 
list.1 = 10 
list.2 = 20 
list.3 = 30 

number_of_elements = 3 
do j = 1 to number_of_elements 
say list.j 
end

As dicas a seguir precisam ser observadas sobre o programa acima -

  • o do loop é usado para iterar através dos elementos da matriz.

  • A variável number_of_elements é usado para armazenar o número de elementos na matriz.

  • o variable j é usado para iterar em cada elemento da matriz.

O resultado do programa acima será -

10
20
30

Arrays bidimensionais

Também foi mencionado que podemos construir arrays multidimensionais no Rexx. Vejamos um exemplo de como podemos implementar um array bidimensional.

Example

/* Main program */ 
list.1 = 10 
list.1.1 = 11 
list.1.2 = 12 

say list.1 
say list.1.1 
say list.1.2

O resultado do programa acima será mostrado da seguinte forma -

10
11
12

O seguinte ponto deve ser observado sobre o programa acima -

  • Para criar uma matriz multidimensional, podemos usar outra camada de indexação. Então, em nosso exemplo, usamoslist.1.1 para criar outra matriz interna para o valor de índice 1 da matriz da lista.

Até agora, vimos instruções que foram executadas uma após a outra de maneira sequencial. Além disso, as instruções são fornecidas no Rexx para alterar o fluxo de controle na lógica de um programa. Eles são então classificados em um fluxo de declarações de controle que estudaremos em detalhes.

Uma instrução de loop nos permite executar uma instrução ou grupo de instruções várias vezes. A ilustração a seguir é a forma geral de uma instrução de loop na maioria das linguagens de programação.

Vamos discutir vários loops suportados pela Rexx.

Sr. Não. Tipo de Loop e Descrição
1 fazer loop

o do loopé usado para executar várias instruções por um certo número de vezes. O número de vezes que a instrução precisa ser executada é determinado pelo valor passado para o loop do.

2 loop do-while

A instrução do-while é usada para simular o loop while simples que está presente em outras linguagens de programação.

3 laço do-até

O loop do-until é uma ligeira variação do loop do while. Este loop varia no fato de que sai quando a condição sendo avaliada é falsa.

Repetição Controlada

Os loops do podem ser fornecidos para realizar uma repetição controlada de instruções.

Sintaxe

A sintaxe geral desse tipo de declaração é a seguinte.

do index = start [to limit] [by increment] [for count] 
statement #1 
statement #2 
end

A diferença nesta instrução é que existe um índice que é usado para controlar o número de vezes que o loop é executado. Em segundo lugar, existem parâmetros que definem o valor com o qual o índice deve começar, onde deve terminar e qual é o valor do incremento.

Diagrama de fluxo

Vamos verificar o diagrama de fluxo deste loop -

No diagrama acima, você pode ver claramente que o loop é executado com base no valor do índice e como o valor do índice é incrementado.

O programa a seguir é um exemplo da instrução de repetição controlada.

Exemplo

/* Main program */ 
do i = 0 to 5 by 2 
   say "hello" 
end

No programa acima, o valor do count ié definido como 0 primeiro. Em seguida, é incrementado em contagens de 2 até que o valor não seja maior que 5.

A saída do código acima será -

hello 
hello 
hello

As estruturas de tomada de decisão requerem que o programador especifique uma ou mais condições a serem avaliadas ou testadas pelo programa.

O diagrama a seguir mostra a forma geral de uma estrutura típica de tomada de decisão encontrada na maioria das linguagens de programação.

Há uma instrução ou instruções a serem executadas se a condição for determinada como truee, opcionalmente, outras instruções a serem executadas se a condição for determinada como false.

Vejamos as várias declarações de tomada de decisão disponíveis no Rexx.

Sr. Não. Declaração e descrição
1 Declaração If

A primeira declaração de tomada de decisão é a ifdeclaração. Aif declaração consiste em uma expressão booleana seguida por uma ou mais declarações.

2 Declaração If-else

A próxima declaração de tomada de decisão é a declaração if-else. Aif instrução pode ser seguida por uma instrução else opcional, que é executada quando a expressão booleana é falsa.

Instruções aninhadas If

Às vezes, é necessário ter multiple if statementsembutidos uns nos outros, como é possível em outras linguagens de programação. Na Rexx também isso é possível.

Sintaxe

if (condition1) then 
   do 
      #statement1 
   end 
else 
   if (condition2) then 
      do 
      #statement2 
   end

Diagrama de fluxo

O diagrama de fluxo de aninhados if declarações são as seguintes -

Vamos dar um exemplo de aninhada if declaração -

Exemplo

/* Main program */ 
i = 50 
if (i < 10) then 
   do 
      say "i is less than 10" 
   end 
else 
if (i < 7) then 
   do 
      say "i is less than 7" 
   end 
else 
   do 
      say "i is greater than 10" 
   end

O resultado do programa acima será -

i is greater than 10

Selecione as declarações

Rexx oferece a instrução select que pode ser usada para executar expressões com base na saída da instrução select.

Sintaxe

A forma geral desta declaração é -

select 
when (condition#1) then 
statement#1 

when (condition#2) then 
statement#2 
otherwise 

defaultstatement 
end

O funcionamento geral desta declaração é o seguinte -

  • A instrução select tem um intervalo de instruções when para avaliar diferentes condições.

  • Cada when clause tem uma condição diferente que precisa ser avaliada e a instrução subsequente é executada.

  • A instrução caso contrário é usada para executar qualquer instrução padrão se as condições anteriores não evaluate to true.

Diagrama de fluxo

O diagrama de fluxo do select declaração é a seguinte

O programa a seguir é um exemplo da instrução case em Rexx.

Exemplo

/* Main program */ 
i = 50 
select 
when(i <= 5) then 
say "i is less than 5" 

when(i <= 10) then 
say "i is less than 10" 

otherwise 
say "i is greater than 10" 
end

A saída do programa acima seria -

i is greater than 10

Rexx tem os seguintes tipos de dados quando se trata de números.

  • Integer- Uma string numérica que não contém um ponto decimal ou identificador de expoente. O primeiro caractere pode ser um sinal de mais (+) ou menos (-). O número representado deve estar entre -2147483648 e 2147483647, inclusive.

  • Big Integer- Uma sequência de números que não contém um ponto decimal ou um identificador de expoente. O primeiro caractere pode ser um sinal de mais (+) ou menos (-). O número representado deve estar entre -9223372036854775808 e 2147483648, inclusive, ou entre 2147483648 e 9223372036854775807.

  • Decimal - Um dos seguintes formatos -

    • Uma string numérica que contém um ponto decimal, mas nenhum identificador de expoente, onde p representa a precisão e srepresenta a escala do número decimal que a string representa. O primeiro caractere pode ser um sinal de mais (+) ou menos (-).

    • Uma string numérica que não contém um ponto decimal ou um identificador de expoente. O primeiro caractere pode ser um sinal de mais (+) ou menos (-). O número representado é menor que -9223372036854775808 ou maior que 9223372036854775807.

  • Float- Uma string que representa um número em notação científica. A string consiste em uma série de números seguidos por um identificador de expoente (um E ou e seguido por um sinal opcional de mais (+) ou menos (-) e uma série de números). A string pode começar com um sinal de mais (+) ou menos (-).

Vamos agora olhar para os diferentes methods available for numbers.

Sr. Não. Métodos disponíveis para números
1 abdômen

Este método retorna o valor absoluto de um número de entrada.

2 MAX

Este método retorna o valor máximo de uma lista de números.

3 MIN

Este método retorna o valor mínimo de uma lista de números.

4 ALEATÓRIA

Este método retorna um número gerado aleatoriamente.

5 PLACA

Retorna 1 se o número for maior que 0 ou 0 se o número for 0 ou -1 se o número for menor que 0.

6 TRUNC

Este método trunca um número.

Strings em Rexx são denotadas por uma sequência de caracteres. O programa a seguir é um exemplo de strings -

/* Main program */ 
a = "This is a string" 
say a

O resultado do programa acima é o seguinte -

This is a string

Vamos discutir alguns métodos que estão disponíveis no Rexx para strings.

Sr. Não. Métodos disponíveis no Rexx para Strings
1 esquerda

Este método retorna um certo número de caracteres à esquerda da string.

2 direito

Este método retorna um certo número de caracteres à direita da string.

3 comprimento

Este método retorna o número de caracteres na string.

4 reverter

Este método retorna os caracteres em um formato reverso.

5 comparar

Este método compara 2 strings. Retorna "0" se "string1" e "string2" forem idênticos. Caso contrário, ele retorna a posição do primeiro caractere que não corresponde.

6 cópias

Este método copia um string n número de vezes.

7 substr

Este método obtém uma substring de uma determinada string.

8 pos

Este método retorna a posição de uma string dentro de outra.

9 delstr

Este método exclui uma substring de dentro de uma string.

O código em Rexx é normalmente dividido em funções e sub-rotinas. O uso de funções ajuda a segregar o código em muitas unidades lógicas. Vamos examinar essas funções em detalhes.

Definindo uma função

A sintaxe de uma declaração de função é a seguinte -

FunctionName: 
PARSE ARG arguement1, arguement2… arguementN 
Return value

Onde,

  • FunctionName - Este é o nome atribuído à função.

  • PARSE ARG - São palavras-chave no Rexx que são usadas para mencionar que os parâmetros estão sendo passados ​​para a função.

  • arguement1, arguement2… arguementN - Esses são os argumentos passados ​​para a função.

  • Return value - Este é o valor retornado pela função.

O programa a seguir é um exemplo simples de como as funções são usadas no Rexx.

/* Main program */ 
say add(5,6) 
exit 
add: 
PARSE ARG a,b 
return a + b

As seguintes coisas devem ser observadas sobre o programa acima -

  • Estamos definindo uma função chamada add que aceita 2 parâmetros a e b.

  • A função usa a instrução return para retornar a soma de a e b.

  • A instrução de saída deve ser usada para significar o fim do programa principal.

A saída do programa acima seria a seguinte -

11

Trabalhando com Argumentos

No Rexx, existem funções específicas que podem ser feitas para trabalhar com argumentos. Vejamos alguns desses argumentos.

arg

Este método é usado para retornar o número de argumentos definidos para a função.

Syntax -

arg()

Parameters - nenhum

Return Value - Este método retorna o número de argumentos definidos para a função.

Example -

/* Main program */ 
say add(5,6) 
exit 
add: 
PARSE ARG a,b 

say arg() 
return a + b

Output - Quando executarmos o programa acima, obteremos o seguinte resultado.

2 
11

arg (índice)

Este método é usado para retornar o valor do argumento na posição específica.

Syntax -

arg(index)

Parameter -

  • Index - Posição do índice do argumento a ser retornado.

Return Value - Este método retorna o valor do argumento na posição específica.

Example -

/* Main program */ 
say add(5,6) 
exit 
add: 
PARSE ARG a,b 

say arg(1) 
return a + b

Output - Quando executarmos o programa acima, obteremos o seguinte resultado.

5 
11

Funções Recursivas

Uma função ou rotina recursiva é aquela que chama a si mesma. Qualquer função recursiva pode ser codificada de forma tradicional não recursiva (ou iterativamente), mas às vezes a recursão oferece uma solução de problema melhor. Nem todas as linguagens de programação suportam recursão; Rexx, sim.

Vamos ver um exemplo do famoso programa fatorial usando funções recursivas no Rexx.

/* Main program */ 
do n = 1 to 5 
say 'The factorial of' n 'is:' factorial( n ) 
end 
return  

/* Function to get factorial */ 
factorial : procedure 
n = arg(1) 
if n = 1 then 
return 1 
return n * factorial( n - 1 )

O resultado do programa acima é o seguinte -

The factorial of 1 is: 1
The factorial of 2 is: 2 
The factorial of 3 is: 6 
The factorial of 3 is: 24 
The factorial of 3 is: 120

A pilha às vezes é chamada de fila de dados externa, mas seguimos o uso comum e nos referimos a ela como pilha. É um bloco de memória logicamente externo à Rexx. Instruções como push e queue colocam dados na pilha, e instruções como pull e parse pull extraem dados dela. A função embutida enfileirada relata quantos itens estão na pilha.

Vamos dar uma olhada em um exemplo de pilha.

/* STACK: */
/* */ 
/* This program shows how to use the Rexx Stack as either a */ 

/* stack or a queue. */ 
do j = 1 to 3 
push ‘Stack: line #’ || j 

/* push 3 lines onto the stack */ 
end 
do j = 1 to queued() 

/* retrieve and display LIFO */ 
pull line 
say line 
end 
do j = 1 to 3 queue ‘Queue: line #’ || j 

/* queue 3 lines onto the stack */ 
end 
do queued() 

/* retrieve and display FIFO */ 
pull line 
say line 
end 
exit 0

O primeiro loop do no programa coloca três linhas de dados na pilha. Ele usa a instrução push para fazer isso. Numeramos as linhas para que, quando recuperadas na ordem UEPS, sua ordem seja aparente.

Os itens colocados na pilha pela instrução push são recuperados na ordem LIFO -

do j = 1 to 3 
push ‘Stack: line #’ || j     /* push 3 lines onto the stack */ 
end

O próximo bloco de código mostra o uso da função embutida enfileirada para descobrir o número de linhas na pilha, bem como um loop para recuperar todas as linhas da pilha -

do j = 1 to queued()    /* retrieve and display LIFO */ 
pull line 
say line 
end

Como os três itens foram colocados na pilha por push, eles são recuperados no pedido LIFO.

A saída do programa acima será a seguinte.

STACK: LINE #3 
STACK: LINE #2 
STACK: LINE #1

Rexx fornece vários métodos ao trabalhar com E / S. Rexx fornece classes mais fáceis para fornecer as seguintes funcionalidades para arquivos.

  • Lendo arquivos
  • Gravando em arquivos
  • Ver se um arquivo é um arquivo ou diretório

As funções disponíveis no Rexx para E / S de arquivo são baseadas na entrada de linha e na entrada de caracteres e veremos as funções disponíveis para ambas em detalhes.

Vamos explorar algumas das operações de arquivo que Rexx tem a oferecer. Para o propósito desses exemplos, vamos supor que existe um arquivo chamadoNewFile.txt que contém as seguintes linhas de texto -

Example1

Example2

Example3

Este arquivo será usado para as operações de leitura e gravação nos exemplos a seguir. Aqui, discutiremos como ler o conteúdo de um arquivo de maneiras diferentes.

Ler o conteúdo de um arquivo, uma linha por vez

As operações gerais em arquivos são realizadas utilizando os métodos disponíveis na própria biblioteca Rexx. A leitura de arquivos é a mais simples de todas as operações no Rexx.

Vejamos a função usada para fazer isso.

linein

Este método retorna uma linha do arquivo de texto. O arquivo de texto é o nome do arquivo fornecido como parâmetro de entrada para a função.

Syntax -

linein(filename)

Parameter -

  • filename - Este é o nome do arquivo de onde a linha deve ser lida.

Return Value - Este método retorna uma linha do arquivo por vez.

Example -

/* Main program */ 
line_str = linein(Example.txt) 
say line_str

O código acima é muito simples no fato de que o Example.txto nome do arquivo é fornecido para a função linein. Esta função então lê uma linha de texto e fornece o resultado para a variávelline_str.

Output - Quando executarmos o programa acima, obteremos o seguinte resultado.

Example1

Ler o conteúdo de um arquivo de uma só vez

No Rexx, a leitura de todo o conteúdo de um arquivo pode ser realizada com a ajuda da instrução while. O comando while lerá cada linha, uma por uma, até que o final do arquivo seja alcançado.

Um exemplo de como isso pode ser alcançado é mostrado abaixo.

/* Main program */ 
do while lines(Example.txt) > 0  
line_str = linein(Example.txt) 
say line_str 
end

No programa acima, os seguintes itens precisam ser observados -

  • A função de linhas lê o Example.txt Arquivo.

  • A função while é usada para verificar se existem outras linhas no arquivo Example.txt.

  • Para cada linha lida do arquivo, o line_strvariável contém o valor da linha atual. Isso é então enviado para o console como saída.

Output - Quando executarmos o programa acima, obteremos o seguinte resultado.

Example1 
Example2 
Example3

Gravando Conteúdo em um Arquivo

Assim como a leitura de arquivos, o Rexx também tem a capacidade de gravar em arquivos. Vejamos a função que é usada para fazer isso.

lineout

Este método grava uma linha em um arquivo. O arquivo no qual a linha precisa ser gravada é fornecido como o parâmetro para a instrução lineout.

Syntax -

lineout(filename)

Parameter -

  • filename - Este é o nome do arquivo de onde a linha precisa ser gravada.

Return Value- Este método retorna o status da função lineout. O valor retornado é 0 se a linha foi escrita com sucesso, caso contrário, o valor 1 será retornado.

Example -

/* Main program */ 
out = lineout(Example.txt,"Example4")

Output - Sempre que o código acima for executado, a linha "Exemplo4" será gravada no arquivo Example.txt.

Neste capítulo, discutiremos sobre algumas das outras funções disponíveis para arquivos.

Sr. Não. Funções para arquivos
1 Linhas

Esta função retorna o valor 1 ou o número de linhas restantes para ler em um fluxo de entrada. O nome do arquivo é fornecido como entrada para a função.

2 corrente

Esta função é usada para verificar o status de um arquivo. Às vezes, é necessário verificar o status de um arquivo antes de ser usado. Se o arquivo estiver corrompido ou indisponível, nenhuma outra operação poderá ser executada no arquivo. Portanto, faz mais sentido verificar primeiro o status do arquivo.

3 charin

Esta função é usada para ler um caractere por vez de um arquivo. Às vezes, os programas exigem a leitura de arquivos com caracteres e, portanto, essa função pode ser usada para esse propósito.

4 chars

Esta função retorna 1 ou o número de caracteres restantes para ler no próprio arquivo. O nome do arquivo é mencionado como um parâmetro para a função.

5 charout

Esta função é usada para gravar um caractere por vez em um arquivo. O nome do arquivo é inserido como um parâmetro para a função.

Em qualquer linguagem de programação, todo o programa é dividido em módulos lógicos. Isso torna mais fácil escrever código que pode ser mantido facilmente. Este é um requisito básico para qualquer linguagem de programação.

No Rexx, os módulos podem ser escritos usando sub-rotinas e funções. Vejamos as sub-rotinas em detalhes.

Definindo uma sub-rotina

A sintaxe de uma declaração de função é a seguinte -

FunctionName: 
   Statement#1 
   Statement#2 
   …. 
   Statement#N

Onde,

  • FunctionName - Este é o nome atribuído à sub-rotina.

  • Statement#1 .. Statement#N - Estas são a lista de afirmações que compõem a sub-rotina.

O programa a seguir é um exemplo simples que mostra o uso de sub-rotinas.

/* Main program */ 
call add 
exit 
add: 
a = 5 
b = 10 
c = a + b 
say c

As seguintes coisas devem ser observadas sobre o programa acima -

  • Estamos definindo uma sub-rotina chamada add.

  • A sub-rotina faz uma funcionalidade de adição simples.

  • A instrução de saída deve ser usada para significar o fim do programa principal.

A saída do programa acima seria a seguinte -

15

Trabalhando com Argumentos

Também é possível trabalhar com argumentos no Rexx. O exemplo a seguir mostra como isso pode ser alcançado.

/* Main program */ 
call add 1,2 
exit 
add: 
PARSE ARG a,b 
c = a + b 
say c

As seguintes coisas devem ser observadas sobre o programa acima -

  • Estamos definindo uma sub-rotina chamada add que assume 2 parâmetros.

  • Nas sub-rotinas, os 2 parâmetros são analisados ​​usando as palavras-chave PARSE e ARG.

A saída do programa acima seria a seguinte -

3

Métodos Diferentes para Argumentos

Vejamos alguns outros métodos disponíveis para argumentos.

arg

Este método é usado para retornar o número de argumentos definidos para a sub-rotina.

Syntax -

arg()

Parameters - nenhum

Return Value - Este método retorna o número de argumentos definidos para a sub-rotina.

Example -

/* Main program */ 
call add 1,2 
exit 
add: 
PARSE ARG a,b 

say arg() 
c = a + b 
say c

Quando executamos o programa acima, obteremos o seguinte resultado.

2 
3

arg (índice)

Este método é usado para retornar o valor do argumento na posição específica.

Syntax -

arg(index)

Parameters

  • Index - Posição do índice do argumento a ser retornado.

Return Value - Este método retorna o valor do argumento na posição específica.

Example -

/* Main program */ 
call add 1,2 
exit 
add: 
PARSE ARG a,b 

say arg(1) 
c = a + b 
say c

Quando executamos o programa acima, obteremos o seguinte resultado.

1 
3

Cada linguagem de programação possui algumas funções internas que ajudam o programador a realizar algumas tarefas de rotina. Rexx também possui várias funções integradas.

Vejamos todas essas funções disponíveis no Rexx.

Sr. Não. Funções disponíveis no Rexx
1 ENDEREÇO

Este método retorna o nome do ambiente no qual os comandos Rexx estão sendo executados atualmente.

2 BIP

Este método produz um som no sistema em uma determinada frequência e duração.

3 Tipo de dados

Este método retorna o valor de 'NUM' se a entrada for um número válido, caso contrário, ele retornará o valor de 'CHAR'. Você também pode especificar se deseja comparar o valor de entrada com um valor NUM ou CHAR. Em cada caso, o valor retornado será 1 ou 0 dependendo do resultado.

4 ENCONTRO

Este método retorna a data local no seguinte formato.

5 DÍGITOS

Este método retorna a configuração atual de NUMERIC DIGITS conforme definido no sistema atual.

6 ERRORTEXT

Este método retorna a mensagem de erro Rexx associada ao número de erro 'errorno'. Observe que o número do erro deve ser um valor de 0 a 99. Isso é útil nos casos em que seu programa retornou um código de erro e você deseja saber o que o código de erro significa.

7 FORMATO

Este método retorna a configuração atual de 'FORMA NUMÉRICA' que é usada para fazer cálculos matemáticos no sistema.

8 TEMPO

Este método retorna a hora local no formato de relógio de 24 horas, conforme mostrado no programa a seguir.

9 ID DO USUÁRIO

Este método retorna o ID do usuário atual conectado ao sistema.

10 XRANGE

Este método retorna os caracteres no intervalo especificado pelo caractere inicial e final.

11 X2D

Este método retorna a conversão decimal de um hexstring value.

12 X2C

Este método retorna a conversão de caracteres de um valor hexstring.

Uma das maiores vantagens do Rexx é a capacidade de criar scripts reutilizáveis. Freqüentemente, nas organizações hoje em dia, ter scripts reutilizáveis ​​é um grande valor agregado para economizar tempo para realizar tarefas repetitivas comuns.

Por exemplo, as equipes de tecnologia em uma organização de TI podem ter a necessidade de ter scripts que executam tarefas diárias comuns. Essas tarefas podem incluir a interação com os sistemas operacionais. Esses scripts podem ser programados para lidar com códigos de retorno inválidos ou erros.

Rexx oferece muitos comandos de sistema que podem ser usados ​​para realizar tais tarefas repetitivas. Vejamos alguns dos comandos do sistema disponíveis no Rexx.

dir

Este é o comando normal de listagem de diretórios usado no Windows.

Sintaxe

dir

Parâmetros

Nenhum

Valor de retorno

Este método retorna a listagem do diretório atual no sistema.

Exemplo

/* Main program */ 
dir

A saída depende do diretório no sistema.

O programa a seguir é apenas um exemplo.

Resultado

Volume in drive D is LENOVO 
Volume Serial Number is BAC9-9E3F  
Directory of D:\ 
04/06/2016  12:52 AM           268,205 100008676689.pdf 
10/20/2015  08:51 PM    <DIR>          data 
06/01/2016  10:23 AM                31 Example.txt 
10/28/2014  06:55 PM    <DIR>          Intel 
06/02/2016  11:15 AM                23 main.rexx 
12/22/2014  08:49 AM    <DIR>          PerfLogs  
12/13/2015  11:45 PM    <DIR>          Program Files 
12/24/2015  10:26 AM    <DIR>          Program Files (x86) 
07/17/2015  01:21 AM    <DIR>          Users 
12/23/2015  10:01 AM    <DIR>          Windows 
               3 File(s)        268,259 bytes 
               7 Dir(s)     202,567,680 bytes free

Outro exemplo do dir commandé mostrado no programa a seguir. Só que desta vez estamos fazendo uso dospecial rc variable. Esta variável é especial no Rexx e fornece o status da execução dos comandos do sistema. Se o valor retornado for 0, isso significa que o comando foi executado com sucesso. Caso contrário, o número do erro será fornecido no nome da variável rc.

Exemplo

/* Main program */ 
dir 
if rc = 0 then 
   say 'The command executed successfully' 
else 
   say 'The command failed, The error code is =' rc

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

The command failed, The error code is = 127

Comandos de redirecionamento

Rexx também possui a facilidade de usar comandos de redirecionamento. Os seguintes comandos de redirecionamento estão disponíveis no Rexx.

  • < - Este comando é usado para obter a entrada que vem de um arquivo.

  • >- Este comando é usado para enviar o conteúdo para um arquivo. Se o arquivo existir, ele será sobrescrito.

  • >>- Isso também é usado para enviar o conteúdo para um arquivo. Mas a saída é adicionada ao final do arquivo para preservar o conteúdo existente do arquivo.

Vejamos um exemplo de como podemos usar comandos de redirecionamento. No exemplo a seguir, estamos usando o comando sort para classificar um arquivo chamadosortin.txt. Os dados do arquivo são enviados para o comando sort. A saída do comando sort é então enviada para o arquivo sortout.txt.

Exemplo

/* Main program */ 
'sort <sortin.txt> sortout.txt'

Suponha que o arquivo sortin.txt tenha os seguintes dados.

Resultado

b 
c 
a

O arquivo sortout.txt terá então os seguintes dados.

a 
b 
c

A função ADDRESS

Este método é usado para descobrir qual é o ambiente padrão usado para os fluxos de entrada, erro e saída.

Sintaxe

ADDRESS(options)

Parâmetros

  • Opções para qual é o endereço de um determinado sistema.

Valor de retorno

Este método retorna o nome do ambiente para os fluxos de entrada, erro e saída.

Exemplo

/* Main program */ 
say ADDRESS('I') 
say ADDRESS('O') 
say ADDRESS('E')

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

INPUT NORMAL 
REPLACE NORMAL 
REPLACE NORMAL

XML é uma linguagem portátil e de código aberto que permite aos programadores desenvolver aplicativos que podem ser lidos por outros aplicativos, independentemente do sistema operacional e / ou linguagem de desenvolvimento. Esta é uma das linguagens mais comuns usadas para trocar dados entre aplicativos.

O que é XML?

A Extensible Markup Language XML é uma linguagem de marcação muito parecida com HTML ou SGML. Isso é recomendado pelo World Wide Web Consortium e está disponível como um padrão aberto. XML é extremamente útil para rastrear pequenas e médias quantidades de dados sem exigir um backbone baseado em SQL.

Para todos os nossos exemplos de código XML, vamos usar o seguinte arquivo XML simples movies.xml para construção do arquivo XML e leitura do arquivo posteriormente.

<collection shelf = "New Arrivals"> 
   <movie title = "Enemy Behind"> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
   
   <movie title = "Transformers"> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year> 
      <rating>R</rating> 
      <stars>8</stars> 
      <description>A schientific fiction</description> 
   </movie> 
   
   <movie title = "Trigun"> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Vash the Stam pede!</description> 
   </movie> 
   
   <movie title = "Ishtar"> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>2</stars> 
      <description>Viewable boredom </description> 
   </movie> 
</collection>

Começando

Por padrão, a funcionalidade xml não está incluída no interpretador Rexx. Para trabalhar com XML em Rexx, é necessário seguir os seguintes passos.

  • Baixe os seguintes arquivos -

    • Rexxxml - www.interlog.com/~ptjm/

    • Libxml2 - www.ctindustries.net/libxml/

    • iconv-1.9.2.win32 - www.xmlsoft.org/sources/win32/oldreleases/

    • libxslt-1.1.26.win32 - www.xmlsoft.org/sources/win32/oldreleases/

  • Extraia todos os arquivos e certifique-se de que estejam incluídos no caminho do sistema.

Carregando funções XML

Uma vez que todos os arquivos na seção acima foram baixados e registrados com sucesso, a próxima etapa é escrever o código para carregar as funções Rexx XML. Isso é feito com o seguinte código.

rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs') 

if rcc then do 
   say rxfuncerrmsg() 
   exit 1 
end 
call xmlloadfuncs

As seguintes coisas podem ser observadas sobre o programa acima -

  • A função rxfuncaddé usado para carregar bibliotecas externas. oxmlloadfuncs função é usada para carregar todas as bibliotecas no rexxxml arquivo na memória.

  • Se o valor de rcc <> 0, isso resultaria em um erro. Para isso, podemos chamar orxfuncerrmsg para nos fornecer mais detalhes sobre a mensagem de erro.

  • Finalmente ligamos para xmlloadfuncs, para que todas as funcionalidades relacionadas a xml agora possam ser ativadas no programa Rexx.

Vejamos os vários methods available for XML in Rexx.

xmlVersion

Este método retorna a versão das bibliotecas XML e XSLT usadas no sistema.

Sintaxe

xmlVersion()

Parâmetros

Nenhum

Valor de retorno

Este método retorna a versão das bibliotecas XML e XSLT usadas no sistema.

Exemplo

rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs') 

if rcc then do 
   say rxfuncerrmsg() 
   exit 1 
end 
call xmlloadfuncs 
say xmlVersion()

Quando executamos o programa acima, obteremos o seguinte resultado. Novamente, isso depende da versão das bibliotecas XML que estão sendo usadas no sistema.

Resultado

1.0.0 20631 10126

xmlParseXML

Esta função é usada para analisar os dados XML enviados para a função. A árvore do documento é retornada pela função.

Sintaxe

xmlParseXML(filename)

Parâmetros

  • Filename - Este é o nome do arquivo XML que precisa ser analisado.

Valor de retorno

A árvore do documento é retornada pela função. Else retorna 0, se houver um erro.

Exemplo

rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs') 

if rcc then do 
   say rxfuncerrmsg() 
   exit 1 
end 
call xmlloadfuncs 

say xmlVersion() 
sw = xmlParseXML('test.xml')

Resultado

Sem saída geral.

xmlFindNode

Este método avalia o XPath expressionpassou para ele. Isso é usado para analisar a árvore do documento para resultar em umnodeset que pode ser processado posteriormente.

Sintaxe

xmlParseXML(XPath,document)

Parâmetros

  • XPath - Este é o caminho do nó no arquivo xml.

  • document - Este é o documento XML

Valor de retorno

Avalia a expressão XPath e retorna o resultado como um conjunto de nós que pode ser usado posteriormente.

Exemplo

rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs') 

if rcc then do 
   say rxfuncerrmsg() 
   exit 1 
end 
call xmlloadfuncs

say xmlVersion() 
document = xmlParseXML('test.xml') 
nodeset = xmlFindNode('//movie', document) 
say xmlNodesetCount(nodeset)

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

4

A saída mostra o número de nós de filme em nossa lista xml

xmlEvalExpression

O método a seguir é usado para avaliar uma expressão XPath e retornar uma string como resultado.

Sintaxe

xmlParseXML(XPath,Node)

Parâmetros

  • XPath - Este é o caminho do nó no arquivo xml.

  • document - O elemento de nó específico.

Valor de retorno

Uma string é retornada com base na expressão XPath enviada a ela.

Exemplo

rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs') 

if rcc then do 
   say rxfuncerrmsg() 
   exit 1 
end 
call xmlloadfuncs 

document = xmlParseXML('test.xml') 
nodeset = xmlFindNode('//movie', document) 
do j = 1 to xmlNodesetCount(nodeset) 
value = xmlEvalExpression('type', xmlNodesetItem(nodeset, j)) 
say value 
end

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

War, Thriller 
Anime, Science Fiction 
Anime, Action 
Comedy

Regina é outro intérprete Rexx disponível para compilar e executar programas Rexx. O site oficial da Regina é - www.regina-rexx.sourceforge.net/

Algumas das vantagens de usar Regina são as seguintes -

  • Regina pode ser executada em qualquer plataforma, seja Windows, Linux ou Mac OS.

  • Regina trabalha de acordo com todos os padrões disponíveis.

  • Regina tem uma grande comunidade de seguidores e, portanto, existem muitos fóruns e materiais de aprendizagem disponíveis para Regina.

  • Regina tem várias ferramentas disponíveis para escrever e testar programas Rexx.

  • No Regina, você pode executar comandos que não são possíveis no Rexx Interpreter padrão. Por exemplo, se você incluir certas definições de configuração, poderá realmente executar comandos básicos de nível de sistema, o que não é possível no Rexx.

Quando você instala Rexx através da instalação documentada em Chapter 2 – Rexx Environment, o intérprete Regina é instalado junto com ele.

Agora vamos ver alguns dos métodos comuns disponíveis ao usar Regina. Essas funções são as funções estendidas que não estão disponíveis por meio do uso normal.

Para usar as funções estendidas, você precisa incluir a seguinte linha de código. Isso permite o uso das funções estendidas do Regina.

options arexx_bifs

Em segundo lugar, ao executar todos os programas Rexx, use o seguinte comando.

regina main.rexx

Where,

  • regina - Este é o interpretador usado para programas Rexx.

  • main.rexx - Seu programa Rexx.

Vamos agora discutir em detalhes os vários functions of Regina Rexx Interpreter.

Sr. Não. Funções da Intérprete Regina Rexx
1 b2c

Este método é usado para converter um valor binário em um valor de string.

2 bitcomp

O método é usado para comparar strings de 2 bits, bit a bit.

3 bittst

Este método é usado para indicar o estado do bit especificado na sequência de bits.

4 encontrar

Este método é usado para pesquisar a primeira ocorrência de uma string em outra string.

5 getenv

Este método retorna o valor de uma variável de ambiente no sistema.

6 getpid

Este método é usado para obter o valor do ID do processo em execução atual.

7 cerquilha

Este método retorna o atributo hash de uma string como um número decimal. Ele também atualiza o valor hash interno da string.

8 justificar

Este método é usado para adicionar justificar ou cortar o valor de uma string com base no valor do comprimento.

9 putenv

Este método é usado para definir o valor de uma variável de ambiente.

10 diretório

Este método obtém o valor do diretório atual no sistema.

11 chdir

Este método altera o valor do diretório de trabalho atual no sistema.

12 Randu

Este método retorna um número pseudo-aleatório entre 0 e 1.

Um dos recursos mais poderosos do Rexx é sua capacidade de analisar valores de texto. Você provavelmente não verá isso em nenhuma outra linguagem de programação.

O formato geral da instrução de análise é o seguinte -

Sintaxe

PARSE {UPPER|LOWER|CASELESS} source {template}

Where,

  • UPPER - A fonte é convertida para maiúsculas antes da análise.

  • LOWER - A fonte é convertida para minúsculas antes da análise.

  • CASELESS - Quando este parâmetro é passado, a caixa é ignorada.

  • source- Esta é a fonte que precisa ser analisada. Existem muitas opções disponíveis para isso e podem ser qualquer uma das seguintes -

    • ARG - Os argumentos para o programa ou procedimento podem ser usados ​​como fonte.

    • LINEIN - A próxima entrada de linha pode ser usada como fonte.

    • SOURCE - A informação da fonte do programa pode ser usada como fonte.

    • VAR name - O valor de um nome de variável pode ser usado como fonte.

  • template- Este parâmetro especifica como analisar a fonte. Existem muitas opções disponíveis para isso. Alguns deles são mencionados abaixo.

    • variable name - Este é o valor atribuído à variável.

    • literal string - Uma string literal que pode ser usada como padrão para dividir a string.

    • #- Uma posição de caractere absoluta dentro da própria fonte. Portanto, se você especificar um valor de 5, o caractere será usado.

    • +#- Uma posição relativa do caractere dentro da própria fonte. Então, se você especificar um valor de 5, o 5 º personagem vai ser utilizado relativamente.

Vejamos um exemplo simples de como a análise pode ser realizada no Rexx.

Exemplo

/* Main program */ 
parse value 'This is a Tutorial' with word1 word2 word3 word4 
say "'"word1"'" 
say "'"word2"'" 
say "'"word3"'" 
say "'"word4"'"

O programa acima analisa as palavras da frase. Quando um valor consiste em palavras separadas por apenas um espaço e não há espaços à esquerda ou à direita, o valor é fácil de analisar em um número conhecido de palavras da seguinte maneira.

A função de análise é usada no Rexx para pegar um valor de string e então dividi-lo em palavras. No exemplo acima, as palavras são então divididas e armazenadas nas variáveis ​​da palavra.

A saída do programa acima seria a seguinte -

'This' 
'is' 
'a' 
'Tutorial'

Outro exemplo de análise é mostrado no programa a seguir. Desta vez, estamos usando uma cláusula while para fazer a análise.

Exemplo

/* Main program */ 
phrase = 'This is a Tutorial' 

do while phrase <> '' 
   parse var phrase word phrase 
   say "'"word"'" 
   end

O programa acima fornecerá a seguinte saída -

'This' 
'is' 
'a' 
'Tutorial'

Análise Posicional

Rexx também permite trabalhar com análise posicional. Vamos ver um exemplo de como podemos alcançar a análise posicional com a instrução parse.

Exemplo

/* Main program */ 
testString = "Doe       John M.   03/03/78  Mumbai              India"; 
parse var testString name1 11 name2 21 birthday 31 town 51 country 
say name1 
say name2 
say birthday 
say town 
say country

No exemplo acima, você pode observar que, juntamente com o nome da variável, também especificamos onde a string deve terminar. Portanto, para nome1, devemos terminar no 11º caractere e, em seguida, começar a analisar o nome2.

O resultado do programa acima será o seguinte -

Doe 
John M. 
03/03/78 
Mumbai 
India

Você também pode usar relative positional parsing nesse caso.

Exemplo

/* Main program */ 
testString = "Doe       John M.   03/03/78  Mumbai              India"; 
parse var testString name1 +10 name2 +10 birthday +10 town +20 country 
say name1 
say name2 
say birthday 
say town 
say country

A saída do programa acima será conforme mostrado abaixo.

Doe 
John M. 
03/03/78 
Mumbai 
India

Em Rexx, a instrução de sinal é usada geralmente para dois propósitos, que são -

  • Uma é transferir o controle para outra parte do programa. Normalmente é como o rótulo go-to que é usado em outras linguagens de programação.

  • A outra é ir para um rótulo de armadilha específico.

Se o comando de sinal for usado em qualquer um dos comandos de instrução a seguir, as estruturas de controle pendentes serão automaticamente desativadas.

  • se ... então ... senão ...

  • fazer ... acabar

  • do i = 1 a n ... end [e loops do semelhante]

  • selecione quando ... então ... ... etc. caso contrário ... fim

A sintaxe geral da instrução do sinal é mostrada a seguir -

Sintaxe

signal labelName  
   
signal [ VALUE ] labelExpression

Vejamos um exemplo de como usar a instrução de sinal.

Exemplo

/* Main program */ 
n = 100.45 

if \ datatype( n, wholenumber ) then 
   signal msg 
   say 'This is a whole number' 
   return 0 
msg : 
   say 'This is an incorrect number'

A saída do programa acima será conforme mostrado abaixo.

Resultado

This is an incorrect number.

Se você alterar o valor da variável n para um número inteiro, conforme mostrado no programa a seguir -

/* Main program */ 
n = 100 

if \ datatype( n, wholenumber ) then 
   signal msg 
   say ' This is a whole number ' 
   return 0 
msg : 
   say ' This is an incorrect number '

Você obterá a seguinte saída -

This is a whole number

Também se pode transferir para o valor da etiqueta conforme mostrado no seguinte programa -

/* Main program */ 
n = 1 

if \ datatype( n, wholenumber ) then 
   signal msg 

if n < 1 | n > 3 then 
   signal msg  
   signal value n 
   3 : say 'This is the number 3' 
   2 : say ' This is the number 2' 
   1 : say ' This is the number 1' 
   return n 
msg : 
   say ' This is an incorrect number ' 
   exit 99

O resultado do programa acima será mostrado da seguinte forma -

This is the number 1

Ativação / Desativação da Transferência de Rótulo Trap

Como mencionamos anteriormente, a instrução de sinal também pode ser usada para transferir o controle para um rótulo de trap.

A sintaxe geral da transferência do rótulo Trap é fornecida da seguinte forma -

Sintaxe

signal ON conditionName [ NAME Label ] 
  
signal OFF conditionName

Onde,

  • conditionName - Esta é a condição para a qual o sinal deve ser ligado ou desligado.

  • Label - A etiqueta opcional para a qual o programa deve ser desviado.

Vejamos um exemplo de como usar uma transferência de rótulo trap

Exemplo

/* Main program */ 
signal on error 
signal on failure 
signal on syntax 
signal on novalue 
beep(1) 
signal off error 
signal off failure 
signal off syntax 
signal off novalue 
exit 0 
error: failure: syntax: novalue: 
say 'An error has occured'

No exemplo acima, primeiro ligamos os sinais de erro. Em seguida, adicionamos uma instrução que resultará em um erro. Em seguida, temos o rótulo de detecção de erro para exibir uma mensagem de erro personalizada.

A saída do programa acima será a seguinte -

An error has occurred.

A depuração é um recurso importante em qualquer linguagem de programação. Ajuda o desenvolvedor a diagnosticar erros, encontrar a causa raiz e resolvê-los de acordo. No Rexx, o utilitário de rastreamento é usado para depuração. A instrução de rastreamento pode ser implementada de 2 maneiras, uma é o modo em lote e a outra é o modo interativo. Vejamos como implementar as duas opções.

Rastrear em modo de lote

O comando trace é usado para fornecer um nível detalhado de cada comando Rexx que é executado.

A sintaxe geral da instrução trace é mostrada a seguir -

Sintaxe

trace [setting]

Onde a configuração pode ser qualquer uma das seguintes opções -

  • A - Rastreia todos os comandos.

  • C - Apenas rastreia os comandos do host que são enviados ao sistema operacional.

  • E - Apenas rastreia os comandos do host que são enviados ao sistema operacional e que resultaram em um erro.

  • F - Apenas rastreia os comandos do host que são enviados ao sistema operacional que resultaram em uma falha.

  • I - Isso fornece um rastreamento de nível intermediário dos comandos Rexx.

  • L - Esta opção é se você deseja rotular o rastreamento conforme ele acontece.

  • N - Esta é a opção padrão em que nenhum rastreamento acontece.

Vamos dar uma olhada em um exemplo do comando trace.

Exemplo

/* Main program */ 
trace A 

/* Main program */ 
n = 100.45 if datatype( n, wholenumber ) then signal msg 

say 'This is a whole number' 
return 0 

msg : 
   say ' This is an incorrect number '

O resultado do programa acima será o seguinte -

5 *-* n = 100.45 if datatype( n, wholenumber ) then signal msg
   7 *-* say 'This is a whole number
This is a whole number                                                   
   8 *-* return 0

Na saída, você pode ver que um rastreio adicional foi adicionado à saída do programa. As seguintes coisas podem ser observadas sobre a saída -

  • O número da linha junto com a instrução executada é adicionado à saída do rastreamento.

  • Cada linha executada é mostrada na saída do rastreamento.

Função Trace

O rastreamento também pode ser ativado com a ajuda da função de rastreamento. A sintaxe geral e o exemplo são mostrados abaixo.

Sintaxe

trace()

A função acima retorna o nível de rastreamento atual.

Parâmetros

Nenhum

Valor de retorno

A função acima fornece o nível de rastreamento atual.

Exemplo

/* Main program */ 
say trace() 

/* Main program */ 
n = 100.45 if datatype( n, wholenumber ) then signal msg 

say 'This is a whole number' 
return 0 
msg : 

say 'This is an incorrect number '

A saída do programa acima será a seguinte.

N 
This is an incorrect number

A primeira linha de N indica que o traço está definido como Normal.

Definir valor de rastreamento

O nível de rastreamento pode ser definido com a função de rastreamento. A sintaxe geral e o exemplo são mostrados abaixo.

Sintaxe

trace(travel_level)

Parâmetros

  • trace_level - Isso é semelhante às opções disponíveis para definir o nível de rastreamento.

Valor de retorno

A função acima fornece o nível de rastreamento atual.

Exemplo

/* Main program */ 
say trace() 
current_trace = trace('A') 
say current_trace 

/* Main program */ 
n = 100.45 if datatype( n, wholenumber ) then 
signal msg say 'This is a whole number' 
return 0 
msg : 
say ' This is an incorrect number '

O resultado do programa acima será o seguinte -

N 
   4 *-* say current_trace 
N 
   6 *-* n = 100.45 
   7 *-* if \ datatype( n, wholenumber ) then 
   8 *-* signal msg 
   12 *-* say 'This is an incorrect number' 
'This is an incorrect number'

Traçado interativo

O rastreamento interativo é aquele em que o rastreamento é realizado conforme o programa é executado. Assim como em um IDE como o Visual Studio for .Net, no qual você pode adicionar pontos de interrupção e ver como cada instrução é executada, da mesma forma aqui você também pode ver o programa conforme cada linha de código é executada.

A sintaxe geral é a seguinte -

Sintaxe

trace ?options

Onde, as opções são as mesmas para o comando trace, conforme mostrado abaixo.

  • A - Rastreia todos os comandos

  • C - Apenas rastreia os comandos do host que são enviados ao sistema operacional.

  • E - Apenas rastreia os comandos do host que são enviados ao sistema operacional e que resultaram em um erro.

  • F - Apenas rastreia os comandos do host que são enviados ao sistema operacional que resultaram em uma falha.

  • I - Isso fornece um rastreamento de nível intermediário dos comandos Rexx.

  • L - Esta opção é se você deseja rotular o rastreamento conforme ele acontece.

  • N - Esta é a opção padrão em que nenhum rastreamento acontece.

Vamos dar uma olhada em um exemplo de implementação de rastreamento ativo.

Exemplo

/* Main program */ 
trace ?A

/* Main program */ 
n = 100.45 if datatype( n, wholenumber ) then 
signal msg 

say 'This is a whole number' 
return 0 
msg : say 'This is an incorrect number'

A saída do programa acima será conforme mostrado no programa a seguir. O rastreamento irá parar em cada linha de código; então você precisa pressionar o botão Enter para mover para a próxima linha de código.

This is an incorrect number
       +++ "LINUX COMMAND /home/cg/root/5798511/main.rex"
     5 *-* n = 100.45 if datatype( n, wholenumber ) then 
+++ Interactive trace. "Trace Off" to end debug, ENTER to Continue. +++
     6 *-* signal msg 
    10 *-* msg :
    10 *-* say 'This is an incorrect number'

Rexx também tem a capacidade de trabalhar no tratamento de erros como em outras linguagens de programação.

A seguir estão algumas das várias condições de erro que são vistas no Rexx.

  • ERROR - Este evento é gerado sempre que um comando enviado ao sistema operacional resulta em um erro.

  • FAILURE - Este evento é gerado sempre que um comando enviado ao sistema operacional resulta em uma falha.

  • HALT- Normalmente é gerado sempre que uma operação depende de outra operação. Um exemplo é se uma operação de E / S está sendo interrompida por qualquer motivo.

  • NOVALUE - Este evento é gerado quando um valor não foi atribuído a uma variável.

  • NOTREADY - Isso é gerado por qualquer dispositivo de E / S que não esteja pronto para aceitar qualquer operação.

  • SYNTAX - Este evento é gerado se houver algum erro de sintaxe no código.

  • LOSTDIGITS - Este evento é gerado quando uma operação aritmética resulta em perda de dígitos durante a operação.

Erros de trapping

Os erros são capturados com a ajuda do comando de sinal. Vamos dar uma olhada na sintaxe e um exemplo disso.

Sintaxe

signal on [Errorcondition]

Onde,

  • Errorcondition - Esta é a condição de erro fornecida acima.

Exemplo

Vamos dar uma olhada em um exemplo disso.

/* Main program */ 
signal on error 
signal on failure 
signal on syntax 
signal on novalue beep(1) 
signal off error 
signal off failure
signal off syntax 
signal off novalue 
exit 0 
error: failure: syntax: novalue: 
say 'An error has occured'

No exemplo acima, primeiro ligamos os sinais de erro. Em seguida, adicionamos uma instrução que resultará em um erro. Em seguida, temos o rótulo de detecção de erro para exibir uma mensagem de erro personalizada.

A saída do programa acima será conforme mostrado abaixo.

An error has occurred.

Um exemplo de códigos de erro é mostrado no programa a seguir.

/* Main program */ 
signal on error 
signal on failure 
signal on syntax 
signal on novalue beep(1) 
exit 0 
error: failure: syntax: novalue: 

say 'An error has occured' 
say rc 
say sigl

A saída do programa acima será conforme mostrado abaixo.

An error has occured 
40 
6

Ao instalar ooRexx de acordo com o capítulo de ambiente, você também terá a capacidade de trabalhar com classes e objetos. Observe que todo o código a seguir precisa ser executado no interpretador ooRexx. O interpretador Rexx normal não será capaz de executar este código orientado a objetos.

Declarações de classe e método

Uma classe é definida com a seguinte declaração de sintaxe.

Sintaxe

::class classname

Onde classname é o nome dado à classe.

Um método em uma classe é definido com a seguinte declaração de sintaxe.

Sintaxe

::method methodname

Onde methodname é o nome dado ao método.

Uma propriedade em uma classe é definida com a declaração de sintaxe abaixo.

Sintaxe

::attribute propertyname

Onde propertyname é o nome dado à propriedade.

Exemplo

A seguir está um exemplo de uma classe em Rexx.

::class student 
::attribute StudentID 
::attribute StudentName

Os seguintes pontos precisam ser observados sobre o programa acima.

  • O nome da turma é aluno.
  • A classe tem 2 propriedades, StudentID e StudentName.

Métodos getter e setter

Os métodos Getter e Setter são usados ​​para definir e obter automaticamente os valores das propriedades. No Rexx, quando você declara uma propriedade com a palavra-chave attribute, os métodos getter e setter já estão implementados.

Exemplo

::class student 
::attribute StudentID 
::attribute StudentName

No exemplo acima, haveria os métodos Getter e Setter para StudentId e StudentName.

Um exemplo de como eles podem ser usados ​​é mostrado no programa a seguir.

/* Main program */ 
value = .student~new 
value~StudentID = 1 
value~StudentName = 'Joe' 
say value~StudentID 
say value~StudentName 

exit 0 
::class student 
::attribute StudentID 
::attribute StudentName

A saída do programa acima será conforme mostrado abaixo.

1 
Joe

Métodos de Instância

Os objetos podem ser criados a partir da classe por meio do ~new operator. Um método da classe pode ser chamado da seguinte maneira.

Object~methodname

Onde methodname é o método que precisa ser chamado a partir da classe.

Exemplo

O exemplo a seguir mostra como um objeto pode ser criado a partir de uma classe e o respectivo método chamado.

/* Main program */ 
value = .student~new 
value~StudentID = 1 
value~StudentName = 'Joe' 
value~Marks1 = 10 
value~Marks2 = 20 
value~Marks3 = 30 
total = value~Total(value~Marks1,value~Marks2,value~Marks3) 
say total 

exit 0 
::class student 
::attribute StudentID 
::attribute StudentName 
::attribute Marks1 
::attribute Marks2 
::attribute Marks3 
::method 'Total' 
use arg a,b,c 
return (ABS(a) + ABS(b) + ABS(c))

A saída do programa acima será conforme mostrado abaixo.

60

Criação de vários objetos

Também se pode criar vários objetos de uma classe. O exemplo a seguir mostrará como isso pode ser alcançado.

Aqui, estamos criando 3 objetos (st, st1 e st2) e chamando seus membros de instância e métodos de instância de acordo.

Vamos dar uma olhada em um exemplo de como vários objetos podem ser criados.

Exemplo

/* Main program */ 
st = .student~new 
st~StudentID = 1 
st~StudentName = 'Joe' 
st~Marks1 = 10 
st~Marks2 = 20 
st~Marks3 = 30 
total = st~Total(st~Marks1,st~Marks2,st~Marks3) 
say total  

st1  =  .student~new 
st1~StudentID = 2 
st1~StudentName = 'John' 
st1~Marks1 = 10 
st1~Marks2 = 20 
st1~Marks3 = 40 
total = st1~Total(st1~Marks1,st1~Marks2,st1~Marks3) 
say total  

st2  =  .student~new 
st2~StudentID = 3 
st2~StudentName = 'Mark' 
st2~Marks1 = 10 
st2~Marks2 = 20 
st2~Marks3 = 30 
total = st2~Total(st2~Marks1,st2~Marks2,st2~Marks3) 
say total  

exit 0 
::class student 
::attribute StudentID 
::attribute StudentName 
::attribute Marks1 
::attribute Marks2 
::attribute Marks3 
::method 'Total' 
use arg a,b,c 
return (ABS(a) + ABS(b) + ABS(c))

A saída do programa acima será conforme mostrado abaixo.

60 
70 
60

Herança

A herança pode ser definida como o processo em que uma classe adquire as propriedades (métodos e campos) de outra. Com o uso da herança, as informações se tornam gerenciáveis ​​em uma ordem hierárquica.

A classe que herda as propriedades de outra é conhecida como subclass (classe derivada, classe filha) e a classe cujas propriedades são herdadas é conhecida como superclass (classe base, classe pai).

Vamos ver um exemplo de herança em Rexx. No exemplo a seguir, estamos criando uma classe chamadaPerson. A partir daí, usamos a palavra-chave subclasse para criar oStudent class como um sub-class of Person.

Exemplo

/* Main program */ 
st = .student~new 
st~StudentID = 1 
st~StudentName = 'Joe' 
st~Marks1 = 10 
st~Marks2 = 20 
st~Marks3 = 30 
say st~Total(st~Marks1,st~Marks2,st~Marks3)  

exit 0 
::class Person 
::class student subclass Person 
::attribute StudentID 
::attribute StudentName 
::attribute Marks1 
::attribute Marks2 
::attribute Marks3 
::method 'Total' 
use arg a,b,c 
return (ABS(a) + ABS(b) + ABS(c))

A saída do programa acima será conforme mostrado abaixo.

60

A portabilidade é um aspecto importante em qualquer linguagem de programação. Como se sabe, o Rexx está disponível em uma variedade de sistemas operacionais, como Windows e Linux. Portanto, é necessário garantir que, ao desenvolver um programa na plataforma Windows, sejam tomados os cuidados necessários caso os mesmos programas sejam executados na plataforma Linux.

Rexx tem a capacidade de executar comandos de nível de sistema. Existem comandos que podem ser usados ​​para entender qual é o sistema operacional no qual está sendo executado. Com base na saída, ele pode executar as ações apropriadas para ver quais são os comandos que podem ser executados neste sistema operacional.

Exemplo

O exemplo a seguir mostra como as funções de análise são usadas para obter os detalhes do sistema operacional no qual o programa está sendo executado.

/* Main program */ 
parse version language level date month year. 
parse source system invocation filename. 
language = translate(language) 

if pos('REGINA',language) = 0 then 
   say 'Error , the default interpreter is not Regina' language 
   say 'The Interpreter version/release date is:' date month year 
   say 'The Language level is: ' level say 'The Operating System is'  

   select 
when system = 'WIN32' then 
   'ver'
when system = 'UNIX' | system = 'LINUX' then 
   'uname -a' 
   otherwise 
   say 'Unknown System:' system 
end 
if rc <> 0 then 
   say 'Error :' rc

A saída irá variar dependendo do sistema operacional. Um exemplo de saída é fornecido abaixo.

The Interpreter version/release date: 5 Apr 2015 
The Language level is:  5.00 
The Operating System is 
Unknown System: WIN64 
Bad return code: RC

Rexx fornece várias funções estendidas que fornecem uma ampla variedade de funcionalidades, a maioria delas permitindo a você interagir com o sistema operacional. Vejamos alguns deles em detalhes, conforme explicado a seguir.

Sr. Não. Funções estendidas
1 b2c

Esta função converte um valor binário em um valor de string.

2 bitclr

Esta função é usada para alternar o bit especificado na string binária para 0.

3 bitcomp

Esta função é usada para comparar 2 strings binárias começando com o bit 0.

4 buftype

Esta função é usada para exibir o conteúdo da pilha que normalmente é usada para fins de depuração.

5 cripta

Esta função é usada para criptografar uma string.

6 garfo

Esta função é usada para gerar um novo processo filho no sistema.

7 getpid

Esta função obtém o id do processo em execução atual.

8 cerquilha

Esta função retorna o valor hash de uma string.

Rexx fornece uma série de instruções que fornecem uma ampla variedade de funcionalidades, a maioria delas permitindo a você interagir com o sistema operacional. Vejamos alguns deles em detalhes.

Sr. Não. Instruções Rexx
1 endereço

Esta função é usada para exibir o ambiente de comando atual.

2 solta

Esta função é usada para cancelar a atribuição de uma variável.

3 interpretar

Interpreta ou executa a instrução definida.

4 nop

Esta função significa não realizar nenhuma operação. Este comando é normalmente usado emif statements.

5 Puxar

Isso é usado para puxar entrada da pilha ou do fluxo padrão.

6 empurrar

Isso é usado para enviar um valor para a pilha Rexx.

A linguagem Rexx tem várias implementações, como já vimos nos capítulos anteriores. Cada implementação possui sua própria funcionalidade. Vejamos as várias implementações disponíveis para Rexx.

OoRexx

Esta é a versão orientada a objetos do Rexx. Por padrão, a implementação básica do Rexx é toda baseada em procedimentos. Mas com o ooRexx você pode oferecer maior flexibilidade tendo uma abordagem orientada a objetos para Rexx. Usando ooRexx, você pode ter uma melhor reutilização através da criação de classes e objetos reutilizáveis.

O programa a seguir é um exemplo de um programa Rexx simples que pode ser executado com o implementador ooRexx.

Exemplo

/* Main program */ 
say ‘hello’

Para executar este programa, execute o seguinte comando.

rexx main.rexx

Ao executar o comando acima, você obterá a seguinte saída.

hello

Netrexx

Isso é para todos os desenvolvedores baseados em Java, pois fornece uma alternativa baseada em Java para a linguagem Rexx. Portanto, todos os objetos são baseados no modelo de objeto Java. A vantagem desta estrutura é que, como Java é uma linguagem amplamente popular, torna-se mais fácil para os desenvolvedores usarem esta estrutura. Portanto, nesta implementação, o código Rexx é convertido em um programa Java que pode ser executado em qualquer máquina virtual Java.

O código a seguir é um exemplo de um programa NetRexx.

Crie um arquivo chamado main.nrx e coloque o código a seguir no arquivo.

/* Main program */ 
say ‘hello’

Para compilar o código, execute o seguinte comando -

NetRexxC main.nrx

Você obterá a seguinte saída. NetRexxC é o compilador que converte o programa Rexx em seu equivalente em java.

java -cp ";;G:\NetRexx-3.04GA\lib\NetRexxF.jar;." 
-Dnrx.compiler = ecj org.netrexx.process.NetRexxC  main.nrx 
NetRexx portable processor 3.04 GA build 4-20150630-1657 
Copyright (c) RexxLA, 2011,2015.   All rights reserved. 
Parts Copyright (c) IBM Corporation, 1995,2008. 
Program main.nrx 
Compilation of 'main.nrx' successful

Agora você pode executar seu programa java usando o seguinte comando java.

java main

Ao executar o comando acima, você obterá a seguinte saída.

Hello

Brexx

Esta é uma implementação leve do Rexx. Este é um pacote mais leve do que o implementador Rexx padrão. Mas ainda possui todas as funcionalidades do Rexx.

O código a seguir é um exemplo de um programa BRexx.

/* Main program */ 
say ‘hello’

Para executar o programa, execute o seguinte comando.

rexx32 main.rexx

Ao executar o comando acima, você obterá a seguinte saída.

hello

NetRexx é a implementação java do Rexx. No NetRexx, o implementador é usado para converter o programa Rexx em um programa java que pode ser executado em qualquer máquina virtual Java.

Configurando NetRexx

A primeira etapa do NetRexx é configurá-lo na máquina local. Para fazer isso, é necessário executar as seguintes etapas -

Step 1 - Vá para o site de download NetRexx - http://www.netrexx.org/downloads.nsp

Baixe o arquivo NetRexx.3.04.GA.

Step 2- Certifique-se de que o java está instalado e funcionando em seu sistema. Você pode verificar se o java está sendo executado usando o comando java – version.

Um exemplo da saída é mostrado abaixo.

H:\>java -version 
java version "1.7.0_79" 
Java(TM) SE Runtime Environment (build 1.7.0_79-b15) 
Java HotSpot(TM) Client VM (build 24.79-b02, mixed mode, sharing)

Step 3- Descompacte o conteúdo do arquivo compactado Netrexx. Copie os arquivos da pasta NetRexx3.04GA \ lib para a pasta de instalação do java / lib / etc.

Step 4 - Adicione o caminho NetRexx-3.04GA \ bin à variável de caminho no sistema.

Executando o primeiro programa NetRexx

Crie um arquivo chamado main.nrx e coloque o código a seguir no arquivo.

/* Main program */ 
say ‘hello’

Para compilar o código, execute o seguinte comando.

NetRexxC main.nrx

Você obterá a seguinte saída. NetRexxC é o compilador que converte o programa rexx em seu equivalente em java.

java -cp ";;G:\NetRexx-3.04GA\lib\NetRexxF.jar;." 
-Dnrx.compiler = ecj org.netrexx.process.NetRexxC  main.nrx 
NetRexx portable processor 3.04 GA build 4-20150630-1657 
Copyright (c) RexxLA, 2011,2015.   All rights reserved. 
Parts Copyright (c) IBM Corporation, 1995,2008. 
Program main.nrx 
Compilation of 'main.nrx' successful

Agora você pode executar seu programa java usando o seguinte comando java.

java main

Ao executar o comando acima, você obterá a seguinte saída.

Hello

Vamos agora discutir alguns dos special aspects of the Netrexx library.

Strings Indexadas

No NetRexx, as strings podem se tornar os índices de arrays. Um exemplo é mostrado abaixo.

Exemplo

/* Main program */ 
value = 'unknown' 
value['a'] = 'b' 
c = 'a' 
say value[c]

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

b

Múltiplos índices

No NetRexx, você pode ter vários índices para matrizes. Um exemplo é mostrado abaixo.

Exemplo

/* Main program */ 
value = 'null' 
value['a', 'b'] = 1 
say value['a', 'b']

Quando executamos o programa acima, obteremos o seguinte resultado.

Resultado

1

Sr. Não. Comando e Descrição
1 perguntar ao comando

Este comando é usado para ler uma linha do fluxo de entrada padrão.

2 Comando de dígitos

Este comando é usado para exibir o valor atual do valor dos dígitos.

3 Form Command

Este comando é usado para exibir o valor atual do valor do formulário.

4 comprimento Comando

Este comando é usado para exibir o comprimento de um valor de string.

5 versão Comando

Este comando é usado para retornar a versão atual do NetRexx em uso.

6 Comando de rastreamento

Este comando é usado para retornar a configuração de rastreamento atual usada pelo NetRexx.

BRexx é uma implementação mais leve do Rexx. Ele ainda tem muitas funcionalidades a oferecer como parte da implementação do Rexx.

Configurando o BRexx

A primeira etapa no BRexx é configurá-lo na máquina local. Para fazer isso, é necessário executar as seguintes etapas -

Step 1 - Vá para o site de download BRexx - https://ftp.gwdg.de/pub/languages/rexx/brexx/html/rx.html

Vá para a seção de downloads e baixe o produto.

Step 2 - Descompacte o conteúdo do arquivo compactado Brexx.

Step 3 - Adicione o caminho BRexx \ bin à variável de caminho no sistema.

Step 4 - Crie uma nova variável chamada RXLIB e aponte-a para a pasta lib na pasta Brexx.

Executando o Primeiro Programa BRexx

Crie um arquivo chamado main.rexx e coloque o código a seguir no arquivo.

/* Main program */ 
say ‘hello’

Para executar o programa, execute o seguinte comando.

rexx32 main.rexx

Ao executar o comando acima, você obterá a seguinte saída.

hello

Vamos agora discutir algumas das funções mais comumente usadas disponíveis na biblioteca BRexx.

Sr. Não. Funções disponíveis na Biblioteca BRexx
1 Comando acos

Este comando é usado para obter a conversão de arco-cosseno de um número.

2 cos Comando

Este comando é usado para obter a conversão do cosseno de um número.

3 comando pecado

Este comando é usado para obter a conversão do seno de um número.

4 Comando asin

Este comando é usado para obter a conversão do arco seno de um número.

5 comando tan

Este comando é usado para obter a conversão tangente de um número.

6 Comando Atan

Este comando é usado para obter a conversão do arco tangente de um número.

7 Comando mkdir

Este comando é usado para criar um diretório no diretório de trabalho atual.

8 Comando rmdir

Este comando é usado para remover um diretório no diretório de trabalho atual.

9 Comando dir

Este comando é usado para retornar a listagem de diretório inteira.

Rexx tem a capacidade de trabalhar com uma variedade de bancos de dados listados abaixo.

  • HSQLDB
  • Oracle
  • servidor SQL
  • MySQL
  • MongoDB

Todas as informações dos bancos de dados Rexx podem ser encontradas clicando no seguinte link - https://rexxsql.sourceforge.net/

Em nosso exemplo, usaremos o banco de dados MySQL como amostra. Portanto, a primeira etapa é garantir o download dos drivers necessários do site Rexx SQL para que os programas Rexx possam trabalhar com SQL de acordo. Portanto, siga as etapas subsequentes para garantir que os programas Rexx possam funcionar com bancos de dados MySQL.

Step 1 - Vá para a seguinte página de download de drivers no site da Rexx - https://sourceforge.net/projects/rexxsql/files/rexxsql/2.6/

Step 2 - Baixe os drivers MYSQL - rxsql26B3_my_w32_ooRexx

Step 3 - Descompacte o conteúdo na máquina local.

Step 4 - Adicione o caminho da pasta descompactada à variável de caminho em sua máquina.

Para todos os exemplos subsequentes, certifique-se de que as seguintes dicas estão no lugar -

  • Você criou um banco de dados TESTDB.

  • Você criou uma tabela EMPLOYEE em TESTDB.

  • Esta tabela contém os campos FIRST_NAME, LAST_NAME, AGE, SEX e INCOME.

  • O ID do usuário "testuser" e a senha "test123" são definidos para acessar o TESTDB.

  • Certifique-se de ter baixado o arquivo jar mysql e adicionado o arquivo ao seu classpath.

  • Você passou pelo tutorial do MySQL

Conexão de banco de dados

Para estabelecer uma conexão com o banco de dados, primeiro você precisa da DLL Rexxsql e, em seguida, usar a função SQLConnect para estabelecer uma conexão com o banco de dados. A sintaxe e o exemplo de como isso pode ser feito são fornecidos a seguir.

Sintaxe

SQLConnect(cname,username,password,dbname)

Parâmetros

  • cname - Este é o nome a ser dado à conexão.

  • username - O nome de usuário para se conectar ao banco de dados.

  • password - A senha para se conectar ao banco de dados.

  • dbname - O esquema do banco de dados ao qual se conectar.

Valor de retorno

Um valor igual a 0 significa que a conexão com o banco de dados foi bem-sucedida.

Exemplo

/* Main program */ 
Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' 
Call SQLLoadFuncs 
say SQLConnect(c1,' testuser ',' test123','testdb')

A saída do programa acima seria conforme mostrado abaixo.

0

Criando uma tabela de banco de dados

A próxima etapa após conectar-se ao banco de dados é criar as tabelas em nosso banco de dados. O exemplo a seguir mostra como criar uma tabela no banco de dados usando Rexx. Todos os comandos em Rexx SQL são executados usando a função SQLCommand.

Sintaxe

SQLConnect(sname,statement)

Parâmetros

  • sname - Este é o nome a ser dado à instrução a ser executada.

  • statement - Esta é a instrução que precisa ser executada no banco de dados.

Valor de retorno

Um valor igual a 0 significa que o comando foi bem-sucedido.

Exemplo

/* Main program */ 
Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' 
Call SQLLoadFuncs 

if SQLConnect(c1,'testuser','test123','testdb') == 0 then say 'Connect Succedded' 
if SQLCommand(u1,"use testdb") == 0 then say 'Changed database to testdb' 
   sqlstr = 'create table employee (first_name char(20) not null, last_name 
   char(20),age int, sex   
   char(1), income float)' 

if SQLCommand(c2,sqlstr) == 0 then say 'Employee table created'

A saída do programa acima seria conforme mostrado abaixo.

Connect Succedded 
Changed database to testdb 
Employee table created

Operações em uma tabela de banco de dados

Os seguintes tipos de operações são mais comumente executados em uma tabela de banco de dados.

Sr. Não. Operação e descrição
1 Operação de inserção

É necessário quando você deseja criar seus registros em uma tabela de banco de dados.

2 Leia a operação

Uma operação READ em qualquer banco de dados significa buscar algumas informações úteis do banco de dados.

3 Operação de atualização

A Operação UPDATE em qualquer banco de dados significa atualizar um ou mais registros, que já estão disponíveis no banco de dados.

4 Excluir operação

A operação DELETE é necessária quando você deseja excluir alguns registros de seu banco de dados.

5 Fechando uma conexão

O seguinte comando pode ser usado para fechar uma conexão com o banco de dados.

Realizando Transação

As transações são um mecanismo que garante a consistência dos dados. As transações têm as seguintes quatro propriedades -

  • Atomicity - Ou uma transação é concluída ou nada acontece.

  • Consistency - Uma transação deve começar em um estado consistente e deixar o sistema em um estado consistente.

  • Isolation - Os resultados intermediários de uma transação não são visíveis fora da transação atual.

  • Durability - Depois que uma transação foi confirmada, os efeitos são persistentes, mesmo após uma falha do sistema.

Aqui está um exemplo simples de como implementar transações.

Exemplo

/* Main program */ 
Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs' 
Call SQLLoadFuncs 

if SQLConnect(c1,'testuser','test123','testdb') == 0 then say 'Connect Succedded' 
if SQLCommand(u1,"use testdb") == 0 then say 'Changed database to testdb' 
   sqlstr = "DELETE FROM EMPLOYEE WHERE AGE > 20" 

if SQLCommand(c2,sqlstr) == 0 then 
if sqlcommit() == 0 then say committed

A saída do programa acima seria conforme mostrado abaixo.

Connect Succedded 
Changed database to testdb 
COMMITTED

Confirmar operação

A operação de confirmação é o que diz ao banco de dados para prosseguir com a operação e finalizar todas as alterações no banco de dados. Em nosso exemplo acima, isso é alcançado pelo seguinte comando.

Sqlcommit()

Operação de reversão

Se você não estiver satisfeito com uma ou mais das alterações e quiser reverter essas alterações completamente, use o método de reversão. Em nosso exemplo acima, isso é alcançado pelo seguinte comando.

SqlRollback()

Os dispositivos portáteis já percorreram um longo caminho e o Rexx tem muitas maneiras de funcionar nesses dispositivos. Rexx tem suporte para Pocket PC, dispositivos Palm, PDAs e outros dispositivos de smartphone. A vantagem do Rexx para trabalhar nessas plataformas é que o Rexx é, na verdade, um sistema de programação de peso pequeno que roda na extensão de alguns kilobytes. Portanto, torna-se mais fácil executar programas Rexx nesses dispositivos.

O Rexx em dispositivos portáteis pode ser executado nos seguintes modos -

  • O primeiro modo é o nó nativo, onde é executado diretamente no próprio sistema operacional. A vantagem de executar nesse modo é que ele é mais rápido, pois é executado diretamente no sistema operacional.

  • O próximo modo é no topo do DOS ou programa emulador no topo do dispositivo portátil. A vantagem desse modo é que ele pode ser executado em qualquer tipo de sistema operacional, desde que o emulador seja executado nesse sistema operacional.

Os intérpretes Rexx para as várias categorias de dispositivos portáteis são mostrados abaixo.

  • Windows CE - Brexx
  • Palm OS - Rexx para Palm OS
  • Symbian OS - Regina

Para o emulador DOS, as seguintes etapas precisam ser realizadas -

Step 1- Primeiro é fazer o download do PocketDOS, um emulador DOS popular. Ele foi projetado para funcionar em muitos sistemas operacionais e tem suporte para telas VGA comuns e portas seriais e paralelas.

Step 2 - A próxima etapa é baixar os arquivos BRexx para DOS de 16 bits em um PC com Windows.

Step 3 - A etapa final é usar o ActiveSync para sincronizar o programa Rexx com o dispositivo portátil.

Existem alguns outros produtos comerciais baseados em DOS disponíveis. XTM é um produto que se enquadra nesta categoria. As características deste produto são as seguintes -

  • Suporte para CPU 80186 e conjunto de instruções.

  • Ele meio que funciona fora do código BIOS para um melhor desempenho.

  • Pode fornecer emulação para o coprocessador Math, versão 8087 MPU

  • Ele fornece acesso às portas seriais.

  • Suporta uma variedade de idiomas, como inglês, francês e alemão.

Um dos principais aspectos de qualquer linguagem de programação é o desempenho do aplicativo. Práticas especiais precisam ser tomadas para garantir que o desempenho do aplicativo não seja prejudicado. Vejamos algumas das considerações descritas nas etapas para melhor compreensão -

Step 1- Tente reduzir o número de instruções - No Rexx cada instrução carrega um overhead. Portanto, tente reduzir o número de instruções em seu programa. Um exemplo de instruções que podem ser reprojetadas é mostrado abaixo.

Em vez de usar várias instruções if else, pode-se usar a instrução parse. Assim, como no programa a seguir, em vez de ter uma condição if para cada valor e obter o valor de palavra1, palavra2, palavra3 e palavra4, use a instrução parse.

/* Main program */  

parse value 'This is a Tutorial' with word1 word2 word3 word4 
say "'"word1"'" 
say "'"word2"'" 
say "'"word3"'" 
say "'"word4"'"

Step 2- Tente combinar várias declarações em uma declaração. Um exemplo é mostrado abaixo.

Suponha que se você tivesse o seguinte código que fez a atribuição para - a and b e passou para um método chamado proc.

do i = 1 to 100 
   a = 0 
   b = 1 
   call proc a,b 
end

Você pode facilmente substituir o código fornecido acima pelo código a seguir usando a instrução de análise.

do i = 1 for 100 
   parse value 0 1 with 
   a, 
   b, 
   call proc a,b 
end

Step 3 - Tente substituir o do..to loop com o do..for loopqualquer lugar possível. Isso normalmente é recomendado quando a variável de controle está sendo iterada por meio de um loop.

/* Main program */ 
do i = 1 to 10 
   say i 
end

O programa acima deve ser substituído pelo programa a seguir.

/* Main program */ 
do i = 1 for 10 
   say i 
end

Step 4- Se possível, remova a condição for de um loop do conforme mostrado no programa a seguir. Se a variável de controle não for necessária, basta colocar o valor final no loop do conforme mostrado abaixo.

/* Main program */ 
do 10 
   say hello 
end

Step 5 - em um select clause, o que quer que você sinta que é a melhor condição que será avaliada, deve ser colocado primeiro no when clause. Portanto, no exemplo a seguir, se sabemos que 1 é a opção mais frequente, colocamos owhen 1 clause como a primeira cláusula na instrução select.

/* Main program */ 
select 
   when 1 then say'1' 
   when 2 then say'2' 
   otherwise say '3' 
end

Todo programador deseja que seu programa seja o melhor quando se trata de qualidade e eficiência. A seguir estão algumas das melhores práticas de programação ou dicas ao escrever programas Rexx que podem ajudar a atingir esses objetivos.

Dica 1

Use o comando address antes de emitir qualquer comando para o sistema operacional ou prompt de comando. Isso o ajudará a obter o espaço de endereço na memória antecipadamente e fará com que seu programa seja executado com mais eficiência.

Um exemplo do comando de endereço é mostrado abaixo.

Exemplo

/* Main program */ 
address system dir

A saída do comando é a seguinte, mas pode variar de sistema para sistema.

Volume in drive H is Apps 
Volume Serial Number is 8E66-AC3D  
Directory of H:\  
06/30/2016  01:28 AM    <DIR>          Apps 
07/05/2016  03:40 AM               463 main.class 
07/07/2016  01:30 AM                46 main.nrx 
07/07/2016  01:42 AM                38 main.rexx 
3 File(s)            547 bytes 
Dir(s)  313,085,173,760 bytes free

Dica 2

Certifique-se de que todos os comandos do sistema operacional estejam em maiúsculas e entre aspas, sempre que possível.

Um exemplo do mesmo é mostrado abaixo.

Exemplo

/* Main program */ 
options arexx_bifs 
say chdir('\REXXML100') 
say directory()

Quando executamos o programa acima, obteremos o seguinte resultado.

0 
D:\rexxxml100

Dica 3

Evite criar blocos de comentários grandes, conforme mostrado no programa a seguir.

Exemplo

/******/ 
/* */ 
/* */ 
/* */ 
/******/ 
/* Main program */ 
address system dir

Dica 4

Use a instrução Parse para atribuir valores padrão. Um exemplo do mesmo é mostrado abaixo.

Exemplo

parse value 0 1 with 
a, 
b

Dica 5

Use a instrução "Left (var1,2)" sempre que possível, em vez da instrução “substr (var1,1,2)".

Dica 6

Use a instrução "Right (var1,2)" sempre que possível em vez da instrução “substr (var1, length (var1), 2)".

Para usar as interfaces gráficas de usuário disponíveis no Rexx, é necessário usar 2 pacotes, um é chamado ActiveTcl e o outro é o Rexxtkpacote. Junto com esses 2 pacotes, pode-se projetar formulários normais que podem ter botões e outros controles nos formulários.

Configuração de ambiente

A primeira coisa a fazer é a configuração do ambiente. Vamos seguir as etapas a seguir para ter o ambiente no lugar.

Step 1 - Baixe o pacote Activetcl do seguinte site - https://www.activestate.com/activetcl

Step 2- O próximo passo é iniciar a instalação do ActiveTCl. Clique no botão Avançar na tela para prosseguir.

Step 3 - Aceite o contrato de licença e clique no botão Avançar.

Step 4 - Escolha um local para a instalação e clique no botão seguinte.

Step 5 - Escolha um local para a instalação dos demos e clique no botão Avançar.

Step 6 - Clique no botão Avançar para prosseguir com a instalação.

Step 7 - Clique no botão Concluir para concluir a instalação.

Step 8 - A próxima etapa é baixar o software Rexxtk no seguinte link - https://sourceforge.net/projects/rexxtk/

Step 9- Clique duas vezes no arquivo do instalador do link na etapa anterior para iniciar a instalação. Clique no próximo botão para prosseguir.

Step 10 - Na próxima tela, clique no botão Sim para concordar com o Contrato de Licença.

Step 11 - Na próxima tela, escolha o local de instalação e clique no botão Avançar.

Step 12 - Escolha o local da pasta do programa e clique no botão seguinte.

Assim que a instalação estiver concluída, podemos agora começar a programar as GUI's no Rexx.

Programa Básico

Vamos ver como podemos projetar um programa básico simples com Rexx em um formato de interface gráfica do usuário.

Exemplo

/* Main program */ 
call RxFuncAdd 'TkLoadFuncs','rexxtk','TkLoadFuncs' 
call TkLoadFuncs 
do forever 
   interpret 'Call' TkWait() 
end 
call TkDropFuncs 
exit 0

As seguintes coisas precisam ser observadas sobre o programa acima -

  • A biblioteca Rexxtk e todas as suas funções são carregadas usando o comando RxFuncAdd.

  • O loop do forever manterá a janela aberta e aguardará a entrada do usuário.

  • Assim que a entrada do usuário for detectada, o programa será encerrado.

Quando o programa acima for executado, você obterá a seguinte saída.

Criando Menus

Os menus são criados com a ajuda das funções TkMenu e TkAdd. A sintaxe dessas funções é fornecida a seguir.

Sintaxe

TkMenu(widgetname,options,0)

Parâmetros

Widgetname - Um nome para dar ao menu.

As opções podem ser qualquer uma das seguintes -

  • selectcolor - se as caixas de seleção ou botões de rádio forem usados ​​como opções de menu, esta opção especifica a cor a ser escolhida quando qualquer opção de menu é selecionada.

  • tearoff - Esta opção é usada para adicionar submenus ao menu principal.

  • title - A string que deve ser usada para dar um título à janela.

Valor de retorno

Um identificador para o menu criado.

Exemplo

/* Main program */ 
call RxFuncAdd 'TkLoadFuncs','rexxtk','TkLoadFuncs' 
call TkLoadFuncs 

menubar = TkMenu('.m1') 
filemenu = TkMenu('.m1.file','-tearoff', 0) 
call TkAdd menubar, 'cascade', '-label', 'File', '-menu', filemenu 
call TkAdd filemenu, 'command', '-label', 'Open...', '-rexx', 'getfile' 
call TkConfig '.', '-menu', menubar 

do forever 
   interpret 'Call' TkWait() 
end 
call TkDropFuncs 
exit 0

As seguintes coisas precisam ser observadas sobre o programa acima -

  • A barra de menu é criada usando a função TkMenu. O parâmetro 'tearoff' significa que precisamos criar submenus que serão anexados ao menu principal.

  • Em seguida, adicionamos 2 opções de menu chamadas Arquivo e Abrir usando a função TkAdd.

Quando o programa acima for executado, você obterá a seguinte saída.

Reginald é outro interpretador Rexx que foi desenvolvido por Jeff Glantt e tem algumas personalizações sobre como os programas Rexx podem ser executados. Nesta seção, veremos como obter a configuração do Reginald e executar alguns programas Rexx nele.

Configuração de ambiente

A primeira etapa é a configuração do ambiente, que consiste em baixar os arquivos Reginald. Isso pode ser feito no seguinte link do site -http://www.manmrk.net/tutorials/rexx/Reginald/win32/rxusrw32.htm

Assim que o download estiver concluído e você iniciar o instalador, a próxima tela permitirá que você escolha o local de instalação.

Clique no botão Instalar para continuar.

Depois de concluído, podemos agora começar a executar um programa de amostra no interpretador Reginald. Crie um programa simples como mostrado abaixo.

/* Main program */ 
say 'Hello'

Em seguida, execute o seguinte comando -

RxLaunch.exe main.rexx

Você obterá a seguinte saída. Este programa agora será executado no interpretador Reginald.

Outras funções disponíveis

Além dos comandos Rexx normais, Reginald tinha alguns comandos específicos que são feitos sob medida para o sistema operacional Windows. DriveMap é um desses comandos -

DriveMap

Esta função fornece informações sobre o conversor.

Syntax -

Drivemap(,options)

Parameters -

Options - Trata-se de uma lista de palavras-chave que podem ser utilizadas para obter várias informações sobre as unidades do computador local.

Return Value

Um valor de string que contém informações sobre a unidade.

Example -

/* Main program */ 
say 'Drives on system : ' DriveMap(,'FIXED')

Se o programa acima for executado, você obterá a seguinte saída. Essa saída depende de sistema para sistema.

List of disk drives :  C:\ D:\

A Rexx também pode trabalhar com servidores web. O mais comum é o servidor web apache. Para usar Rexxw com o servidor da web Apache, você precisa primeiro baixar os módulos Rexx do seguinte link -https://sourceforge.net/projects/modrexx/?source=typ_redirect

Uma vez feito isso, certifique-se de adicionar os módulos mod Rexx ao caminho da classe.

As linhas a seguir precisam ser adicionadas e modificadas no arquivo de configuração do Apache.

As seguintes linhas precisam ser adicionadas ao final do apropriado -

  • Lista httpd.conf LoadModule.
  • LoadModule rexx_module modules / mod_rexx.dll

As seguintes linhas devem ser adicionadas no final do http.conf Arquivo.

  • AddType application / x-httpd-rexx-script .rex .rexx

  • Aplicativo AddType / x-httpd-rexx-rsp .rsp

  • Adicione-os para suporte da página do servidor REXX

  • RexxRspCompiler “c: / Arquivos de programas / Apache Group / Apache2 / bin / rspcomp.rex”

Uma vez que as mudanças acima foram feitas, você precisa desligar e reiniciar o seu servidor web apache.

As linhas acima também permitem que você tenha páginas de servidor baseadas em Rexx, assim como as páginas de servidor Java. Você pode adicionar o código Rexx diretamente às páginas html.

Um exemplo é mostrado abaixo -

<p>The current date and time is 
   <?rexx 
      /* Inserting the rexx statement */ 
      say date() time() 
   ?>
</p>

Quando uma página de servidor baseada em Rexx é executada, as seguintes coisas são realizadas -

  • Primeiro, um arquivo temporário é criado.

  • Em seguida, o compilador do Rexx Server compila o arquivo em um programa Rexx e o coloca no arquivo temporário.

  • A próxima etapa é realmente executar o programa Rexx.

Finalmente, o arquivo temporário é removido.