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 5º 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.