Rexx - Guida rapida
Rexx (Restructured Extended Executor)è progettato per essere un linguaggio di scripting. Il suo obiettivo è rendere lo scripting il più semplice, veloce, affidabile e privo di errori possibile. Molti linguaggi di programmazione sono progettati per la compatibilità con i linguaggi precedenti e sono scritti per pubblici o piattaforme specifici. Rexx ignora obiettivi estranei. È stato progettato fin dal primo giorno per essere potente, ma facile da usare.
Rexx è stato progettato e realizzato prima, in linguaggio assembly, come un progetto 'proprio tempo' tra il 20 ° marzo 1979 e la metà del 1982 da Mike Cowlishaw di IBM, originariamente come un linguaggio di programmazione di scripting di sostituire le lingueEXEC and EXEC 2. È stato progettato per essere un filemacro or scripting languageper qualsiasi sistema. Come tale, Rexx è considerato un precursore di Tcl e Python. Rexx era anche inteso dal suo creatore come una versione semplificata e più facile da imparare del linguaggio di programmazione PL / I.
Caratteristiche di Rexx
Rexx come linguaggio di programmazione ha le seguenti caratteristiche chiave:
Sintassi semplice
La capacità di instradare i comandi a più ambienti
La capacità di supportare funzioni, procedure e comandi associati a uno specifico ambiente di invocazione.
Uno stack integrato, con la capacità di interoperare con lo stack host, se presente.
Piccolo set di istruzioni contenente solo due dozzine di istruzioni
Sintassi a mano libera
Token senza distinzione tra maiuscole e minuscole, inclusi i nomi delle variabili
Base stringa di caratteri
Digitazione dinamica dei dati, nessuna dichiarazione
Nessuna parola chiave riservata, tranne nel contesto locale
Nessuna funzionalità di inclusione dei file
Precisione numerica arbitraria
Aritmetica decimale, virgola mobile
Una ricca selezione di funzioni integrate, in particolare l'elaborazione di stringhe e testi
Gestione automatica della memoria
Protezione dagli urti
Strutture di dati indirizzabili ai contenuti
Array associativi
Accesso diretto ai comandi e alle strutture del sistema
Semplice gestione degli errori, traccia e debugger incorporati
Poche limitazioni artificiali
Strutture I / O semplificate
Il sito web ufficiale di Rexx è www.oorexx.org
Prima di poter iniziare a lavorare su Rexx, devi assicurarti di avere una versione completamente funzionante di Rexx in esecuzione sul tuo sistema. Questo capitolo spiegherà l'installazione di Rexx e la sua successiva configurazione su una macchina Windows per iniziare con Rexx.
Assicurarsi che i seguenti requisiti di sistema siano soddisfatti prima di procedere con l'installazione.
Requisiti di sistema
Memoria | 2 GB di RAM (consigliato) |
Spazio sul disco | Nessun requisito minimo. Preferibilmente avere spazio di archiviazione sufficiente per memorizzare i programmi che verranno creati utilizzando Rexx. |
Versione del sistema operativo | Rexx può essere installato su Windows, Ubuntu / Debian, Mac OS X. |
Download di Rexx
Per scaricare Rexx, dovresti usare il seguente URL: https://www.oorexx.org/download.html
Questa pagina ha una varietà di download per varie versioni di Rexx, come mostrato nello screenshot seguente.
Fare clic sui "file di installazione ooRexx" nella tabella con l'intestazione della versione 4.2.0.
Successivamente, verrai reindirizzato alla pagina seguente.
Clicca sul ooRexx-4.2.0.windows.x86_64.exe per scaricare il file 64-bitversione del software. Discuteremo dell'installazione del software nel capitolo successivo.
I seguenti passaggi spiegheranno in dettaglio come installare Rexx su un sistema Windows.
Step 1- Avvia il programma di installazione scaricato nella sezione precedente. Dopo l'avvio del programma di installazione, fare clic sul pulsante Esegui.
Step 2 - Fare clic sul pulsante Avanti nella schermata successiva per procedere con l'installazione.
Step 3 - Fare clic sul file I Agree per procedere.
Step 4 - Accetta il default components e quindi fare clic sul pulsante Avanti.
Step 5 - Scegli il percorso di installazione e fai clic sul pulsante Avanti.
Step 6 - Accetta i processi predefiniti che verranno installati e fai clic sul pulsante Avanti.
Step 7 - Scegli le associazioni di file predefinite e fai clic sul pulsante Avanti.
Step 8 - Fare clic sulle caselle di controllo di inviare elementi Rexx agli eseguibili, quindi fare clic sul pulsante Avanti come mostrato nella schermata seguente.
Step 9- Nella schermata successiva, scegli l'editor per lavorare con i file Rexx. Mantieni il blocco note come opzione predefinita. Accetta anche l'estensione predefinita per ogni file Rexx.
Step 10 - Accetta le impostazioni predefinite nella schermata successiva che si apre e fai clic sul pulsante Avanti per procedere ulteriormente con l'installazione.
Step 11 - Infine fare clic sul pulsante Installa per procedere con l'installazione.
Step 12 - Una volta completata l'installazione, è necessario fare clic sul pulsante Avanti per procedere ulteriormente.
Step 13 - Fare clic sul pulsante Fine per completare l'installazione.
In questo capitolo, discuteremo su come installare i plug-in su popular IDE’s (Integrated Development Environment). Rexx come linguaggio di programmazione è disponibile anche in IDE popolari comeEclipse. Diamo un'occhiata a come possiamo ottenere i plugin richiesti in questi IDE, in modo da avere più scelte nel lavorare con Rexx.
Installazione in Eclipse
Per eseguire un'installazione senza problemi di Rexx in Eclipse, è necessario attenersi ai seguenti passaggi.
Step 1 - Apri Eclipse e fai clic sulla voce Menu, Help → Eclipse Marketplace come mostrato nello screenshot seguente.
Step 2 - Nella finestra di dialogo successiva, inserisci Rexx nei criteri di ricerca e fai clic sul pulsante di ricerca.
Al termine, fai clic sul pulsante Installa.
Step 3 - Fare clic sul pulsante Conferma per continuare ulteriormente con l'installazione delle funzionalità.
Step 4- Eclipse scaricherà quindi i file necessari per iniziare con l'installazione. Una volta terminato, Eclipse chiederà di accettare i contratti di licenza. Fare clic sull'accettazione degli accordi di licenza e quindi fare clic sul pulsante Fine come mostrato nella seguente schermata.
Eclipse inizierà quindi a installare il software in background.
Step 5- Probabilmente riceverai un avviso di sicurezza (come mostrato nello screenshot seguente). Fare clic sul pulsante OK per procedere.
Step 6- Ti verrà chiesto di riavviare Eclipse una volta installati gli aggiornamenti. Fare clic su Sì per riavviare Eclipse.
Per comprendere la sintassi di base di Rexx, diamo prima un'occhiata a un semplice programma Hello World.
Esempio
/* Main program */
say "Hello World"
Si può vedere quanto sia semplice il programma Hello World. È una semplice riga di script che viene utilizzata per eseguire il programma Hello World.
Le seguenti cose devono essere annotate sul programma di cui sopra:
Il say command viene utilizzato per inviare un valore alla console.
Il /* */ viene utilizzato per i commenti in Rexx.
L'output del programma di cui sopra sarà:
Hello World
Forma generale di una dichiarazione
In Rexx, vediamo una forma generale di un programma. Dai un'occhiata al seguente esempio.
/* Main program */
say add(5,6)
exit
add:
parse arg a,b
return a + b
L'output del programma di cui sopra sarà:
11
Esaminiamo ciò che abbiamo capito dal programma sopra:
Aggiungi è una funzione definita per aggiungere 2 numeri.
Nel programma principale, i valori di 5 e 6 vengono utilizzati come parametri per la funzione di aggiunta.
La parola chiave exit viene utilizzata per uscire dal programma principale. Viene utilizzato per differenziare il programma principale dalla funzione di aggiunta.
La funzione di aggiunta è differenziata con il simbolo ":".
L'istruzione parse viene utilizzata per analizzare gli argomenti in arrivo.
Infine, l'istruzione return viene utilizzata per restituire la somma dei valori numerici.
Subroutine e funzioni
In Rexx, il codice è normalmente suddiviso in subroutine e funzioni. Le subroutine e le funzioni vengono utilizzate per differenziare il codice in diverse unità logiche. La differenza fondamentale tra subroutine e funzioni è che le funzioni restituiscono un valore mentre le subroutine no.
Di seguito è riportato un esempio di differenza chiave tra una subroutine e una funzione per un'implementazione di addizione:
Implementazione della funzione
/* Main program */
say add(5,6)
exit
add:
parse arg a,b
return a + b
Implementazione di subroutine
/* Main program */
add(5,6)
exit
add:
parse arg a,b
say a + b
L'output di entrambi i programmi sarà il valore 11.
Esecuzione di comandi
Rexx può essere utilizzato come linguaggio di controllo per una varietà di sistemi basati su comandi. Il modo in cui Rexx esegue i comandi in questi sistemi è il seguente. Quando Rexx incontra una riga di programma che non è né un'istruzione né un'assegnazione, tratta quella riga come un'espressione stringa che deve essere valutata e quindi passata all'ambiente.
Un esempio è il seguente:
Esempio
/* Main program */
parse arg command
command "file1"
command "file2"
command "file3"
exit
Ciascuna delle tre righe simili in questo programma è un'espressione stringa che aggiunge il nome di un file (contenuto nelle costanti stringa) al nome di un comando (dato come parametro). La stringa risultante viene passata all'ambiente per essere eseguita come comando. Quando il comando è terminato, la variabile "rc" viene impostata sul codice di uscita del comando.
L'output del programma di cui sopra è il seguente:
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)"
Parole chiave in Rexx
La sintassi libera di REXX implica che alcuni simboli sono riservati all'uso da parte del processore del linguaggio in determinati contesti.
All'interno di istruzioni particolari, alcuni simboli possono essere riservati per separare le parti dell'istruzione. Questi simboli sono indicati come parole chiave. Esempi di parole chiave REXX sonoWHILE in a DO instruction, e il THEN (che funge da terminatore di clausola in questo caso) seguendo un IF or WHEN clause.
A parte questi casi, solo i simboli semplici che sono il primo token in una clausola e che non sono seguiti da un "=" o ":" vengono controllati per vedere se sono parole chiave dell'istruzione. È possibile utilizzare i simboli liberamente altrove nelle clausole senza che vengano interpretate come parole chiave.
Commenti in Rexx
I commenti vengono utilizzati per documentare il codice. I commenti a riga singola vengono identificati utilizzando / * * / in qualsiasi posizione nella riga.
Un esempio è il seguente:
/* 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
I commenti possono anche essere scritti tra una riga di codice come mostrato nel seguente programma:
/* 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
L'output del programma di cui sopra sarà:
11
Puoi anche avere più righe in un commento come mostrato nel seguente programma:
/* 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
L'output del programma di cui sopra sarà:
11
In qualsiasi linguaggio di programmazione, è necessario utilizzare varie variabili per memorizzare vari tipi di informazioni. Le variabili non sono altro che posizioni di memoria riservate per memorizzare i valori. Ciò significa che quando crei una variabile riservi dello spazio in memoria per memorizzare il valore associato a quella variabile.
Potresti voler memorizzare informazioni di vari tipi di dati come Stringa, Carattere, Carattere largo, Intero, Virgola mobile, Booleano, ecc. In base al tipo di dati di una variabile, il sistema operativo alloca memoria e decide cosa può essere memorizzato nel riservato memoria.
Tipi di dati incorporati
Rexx offre un'ampia varietà di tipi di dati integrati. Di seguito è riportato un elenco di tipi di dati definiti in Rexx.
Integer- Una stringa di valori numerici che non contiene un punto decimale o un identificatore di esponente. Il primo personaggio può esserea plus (+) or minus (-) sign. Il numero rappresentato deve essere compreso tra -2147483648 e 2147483647 inclusi.
Big Integer- Una stringa di numeri che non contiene un punto decimale o un identificatore di esponente. Il primo carattere può essere un segno più (+) o meno (-). Il numero rappresentato deve essere compreso tra -9223372036854775808 e 2147483648 inclusi o tra 2147483648 e 9223372036854775807.
Decimal - Proverrà da uno dei seguenti formati -
Una stringa di valori numerici che contiene un punto decimale ma nessun identificatore di esponente. Ilp rappresenta la precisione e srappresenta la scala del numero decimale rappresentato dalla stringa. Il primo carattere può essere un segno più (+) o meno (-).
Una stringa di numeri che does not contain a decimal pointo un identificatore di esponente. Il primo carattere può essere un segno più (+) o meno (-). Il numero rappresentato è minore di -9223372036854775808 o maggiore di 9223372036854775807.
Float- Una stringa che rappresenta un numero in notazione scientifica. La stringa è costituita da una serie di numeri seguiti da un identificatore di esponente (una E o una e seguita da un segno più (+) o meno (-) opzionale e una serie di numeri). La stringa può iniziare con un segno più (+) o meno (-).
String - Una normale stringa di caratteri.
Di seguito sono riportati alcuni esempi di come ogni tipo di dati può essere utilizzato. Anche in questo caso ogni tipo di dati verrà discusso in dettaglio nei capitoli successivi. Questo è solo per metterti al corrente con una breve descrizione dei tipi di dati sopra menzionati.
Numero intero
Un esempio di come il tipo di dati numerico può essere utilizzato è mostrato nel seguente programma. Questo programma mostra l'aggiunta di 2 numeri interi.
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
L'output del programma di cui sopra sarà:
11
Big Integer
Il seguente programma mostra la capacità di Rexx di gestire grandi numeri interi. Questo programma mostra come aggiungere 2 numeri interi grandi.
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
L'output del programma di cui sopra sarà:
6.00000000E+21
Decimale
Il seguente programma mostra la capacità di Rexx di gestire i numeri decimali. Questo programma mostra come aggiungere 2 numeri decimali.
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
L'output del programma di cui sopra sarà:
12.1
Galleggiante
L'esempio seguente mostra i casi in cui un numero può funzionare come un 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
L'output del programma di cui sopra sarà:
141200
Corda
Un esempio di come può essere utilizzato il tipo di dati Tuple è mostrato nel seguente programma.
Qui stiamo definendo un file Tuple Pche ha 3 termini. Iltuple_size è una funzione incorporata definita in Rexx che può essere utilizzata per determinare la dimensione della tupla.
Example
/* Main program */
display("hello")
exit
display:
parse arg a
say a
L'output del programma di cui sopra sarà:
hello
In Rexx, tutte le variabili sono associate all'istruzione "=". I nomi delle variabili vengono talvolta definiti simboli. Possono essere composti da lettere, cifre e caratteri come ". ! ? _'. Un nome di variabile creato non deve iniziare con una cifra o un punto. Un semplice nome di variabile non include un punto. Un nome di variabile che include un punto è chiamato variabile composta e rappresenta un array o una tabella.
I seguenti sono i tipi base di variabili in Rexx che sono stati spiegati anche nel capitolo precedente:
Integers- Viene utilizzato per rappresentare un numero intero o un float. Un esempio per questo è 10.
Big integers - Questo rappresenta un valore intero grande.
Decimal - Un valore decimale è una stringa di numeri che contiene un punto decimale ma nessun identificatore di esponente.
Float - Un valore float è una stringa che rappresenta un numero nella notazione scientifica.
String - Una serie di caratteri definisce una stringa in Rexx.
Diversi tipi di funzioni variabili
In questa sezione, discuteremo delle varie funzioni che una variabile può svolgere.
Dichiarazioni di variabili
La sintassi generale per definire una variabile è mostrata come segue:
var-name = var-value
dove
var-name - Questo è il nome della variabile.
var-value - Questo è il valore associato alla variabile.
Il seguente programma è un esempio della dichiarazione di variabile:
Example
/* Main program */
X = 40
Y = 50
Result = X + Y
say Result
Nell'esempio sopra, abbiamo 2 variabili, una è X che è vincolato al valore 40 e il prossimo è Y che è vincolato al valore di 50. Un'altra variabile chiamata Risultato è legata all'aggiunta diX and Y.
L'output del programma di cui sopra sarà il seguente:
90
Denominazione delle variabili
I nomi delle variabili vengono talvolta definiti simboli. Possono essere composti da lettere, cifre e caratteri come ". ! ? _ '. Il nome di una variabile che crei non deve iniziare con una cifra o un punto.
Se a una variabile non è stato ancora assegnato un valore, viene definita non inizializzata. Il valore di una variabile non inizializzata è il nome della variabile stessa in lettere maiuscole.
Un esempio di una variabile non assegnata è il seguente:
Example
/* Main program */
unassignedvalue
say unassignedvalue
Se esegui il programma sopra, otterrai il seguente output:
UNASSIGNEDVALUE
sh: UNASSIGNEDVALUE: command not found
2 *-* unassignedvalue
>>> "UNASSIGNEDVALUE"
+++ "RC(127)"
Alle variabili possono essere assegnati valori più di una volta. Il programma seguente mostra come assegnare più volte un valore al valore di X.
Example
/* Main program */
X = 40
X = 50
say X
L'output del programma di cui sopra sarà il seguente:
50
Variabili di stampa
I valori delle variabili vengono stampati utilizzando il saycomando. Di seguito è riportato un esempio di stampa di una varietà di variabili.
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
L'output del programma di cui sopra sarà il seguente:
40
50.5
hello
Un operatore è un simbolo che dice al compilatore di eseguire specifiche manipolazioni matematiche o logiche.
Rexx ha vari tipi di operatori che sono anche spiegati in dettaglio come segue:
- Operatori aritmetici
- Operatori relazionali
- Operatori logici
- Operatori bit per bit
Operatori aritmetici
Il linguaggio Rexx supporta i normali operatori aritmetici come qualsiasi altro linguaggio. Di seguito sono riportati gli operatori aritmetici disponibili in Rexx.
Mostra esempio
Operatore | Descrizione | Esempio |
---|---|---|
+ | Aggiunta di due operandi | 1 + 2 darà 3 |
- | Sottrae il secondo operando dal primo | 1-2 darà -1 |
∗ | Moltiplicazione di entrambi gli operandi | 2 ∗ 2 darà 4 |
/ | Divisione del numeratore per denominatore | 2/2 darà 1 |
// | Resto della divisione del primo numero per il secondo | 3 // 2 darà 1 |
% | Il componente div eseguirà la divisione e restituirà il componente intero. | 3% 2 darà 1 |
Operatori relazionali
Gli operatori relazionali consentono il confronto di oggetti. Di seguito sono riportati gli operatori relazionali disponibili in Rexx. In Rexx il valore vero è denotato da 1 e il valore falso è denotato da 0.
Mostra esempio
Operatore | Descrizione | Esempio |
---|---|---|
== | Verifica l'uguaglianza tra due oggetti | 2 = 2 darà 1 |
< | Verifica se l'oggetto sinistro è minore dell'operando destro. | 2 <3 darà 1 |
= < | Verifica se l'oggetto sinistro è minore o uguale all'operando destro. | 2 = <3 darà 1 |
> | Verifica se l'oggetto sinistro è maggiore dell'operando destro. | 3> 2 darà 1 |
> = | Controlla se l'oggetto sinistro è maggiore o uguale all'operando destro. | 3> 2 darà 1 |
Operatori logici
Gli operatori logici vengono utilizzati per valutare le espressioni booleane. Di seguito sono riportati gli operatori logici disponibili in Rexx.
Mostra esempio
Operatore | Descrizione | Esempio |
---|---|---|
& | Questo è l'operatore logico "and" | 1 o 1 darà 1 |
| | Questo è l'operatore logico "or" | 1 o 0 darà 1 |
\ | Questo è l'operatore logico "non" | \ 0 darà 1 |
&& | Questo è l'operatore logico esclusivo "or" | 1 && 0 darà 1 |
Operatori bit per bit
Groovy fornisce quattro operatori bit per bit. Di seguito sono riportati gli operatori bit per bit disponibili in Groovy.
Mostra esempio
Sr.No. | Operatore e descrizione |
---|---|
1 | bitand Questo è l'operatore "and" bit per bit |
2 | bitor Questo è l'operatore "or" bit per bit |
3 | bitxor Questo è l'operatore "xor" o Exclusive or bit per bit |
Precedenza operatore
La tabella seguente mostra la precedenza degli operatori per gli operatori Rexx in ordine decrescente di priorità della loro precedenza.
Operatori | Precedenza |
---|---|
Operatori di prefisso | + - \ |
Addizione e sottrazione | + - |
Operatori di confronto | = ==> <> = <= |
AND logico | & |
OR logico | | |
ESCLUSIVO O | && |
Gli array in qualsiasi linguaggio di programmazione consentono di raggruppare un elenco di valori dello stesso tipo. L'uso degli array è che ti permette di costruire un elenco di valori simili che sonosortable, searchable e può essere easily manipulated. Rexx consente anche di definire gli array. Questi array possono essere unidimensionali o multidimensionali.
Gli array Rexx possono essere sparsi. Cioè, non tutte le posizioni dell'array devono avere un valore o addirittura essere inizializzate. Possono esserci posizioni di array vuote, o slot, tra quelli che contengono elementi di dati. Oppure gli array possono essere densi, in cui slot di array consecutivi contengono tutti elementi di dati.
In molti linguaggi di programmazione, devi preoccuparti di quale sia il pedice della prima voce in una tabella. Il primo pedice numerico è 0 o 1? In Rexx, il primo pedice è quello che usi! Quindi, inserisci il primo elemento dell'array nella posizione 0 o 1 come preferisci.
array_name.0 = ‘first element’
o
array_name.1 = ‘first element’
Diamo un'occhiata alle diverse operazioni disponibili per gli array.
Creazione di array
Gli array vengono creati con la stessa convenzione di denominazione utilizzata per le variabili in Rexx.
La sintassi generale per la creazione di array è la seguente:
Arrayname.index = value
dove
Arrayname - Questo è il nome fornito all'array.
Index - Questa è la posizione dell'indice nell'array per fare riferimento a un elemento specifico.
Value - Questo è il valore assegnato all'elemento index nell'array.
Un esempio di una dichiarazione di matrice è il seguente:
Example
/* Main program */
list.1 = 0
list.2 = 0
list.3 = 0
I seguenti punti devono essere annotati sul programma di cui sopra:
- Il nome dell'array viene fornito come elenco
- Ci sono 3 elementi dell'array che vengono inizializzati con il valore 0.
Assegnazione di valori a un elemento array
I valori possono essere riassegnati agli elementi dell'array nello stesso modo in cui vengono inizializzati gli elementi dell'array.
Il seguente programma è un esempio di valori che possono essere assegnati a vari valori di indice di un array esistente.
/* Main program */
list.1 = 0
list.2 = 0
list.3 = 0
/* Assigning new values to the array*/
list.1 = 10
list.3 = 30
Visualizzazione dei valori di una matrice
I valori di un array possono essere visualizzati facendo riferimento alla posizione di indice dell'elemento array. L'esempio seguente mostra come accedere a vari elementi dell'array.
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
L'output del programma di cui sopra sarà il seguente:
10
0
30
Copia di array
Tutti gli elementi di un array possono essere copiati su un altro array. La sintassi generale di questo è la seguente:
Newarray. = sourcearray.
dove
Newarray - Questo è il nuovo array in cui devono essere copiati gli elementi.
Sourcearray - Questo è l'array di origine da cui è necessario copiare gli elementi.
Un esempio di come possono essere eseguite le operazioni di copia per array è mostrato nel seguente programma:
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
L'output del programma di cui sopra sarà:
10
0
30
Iterazione attraverso gli elementi dell'array
Gli elementi di un array possono anche essere iterati utilizzando le istruzioni iterative disponibili in Rexx. Un esempio di come questo può essere fatto è il seguente:
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
I seguenti suggerimenti devono essere annotati sul programma di cui sopra:
Il do loop viene utilizzato per scorrere gli elementi dell'array.
La variabile number_of_elements viene utilizzato per memorizzare il numero di elementi nell'array.
Il variable j è usato per scorrere ogni elemento dell'array.
L'output del programma di cui sopra sarà:
10
20
30
Array bidimensionali
È stato anche detto che possiamo costruire array multidimensionali in Rexx. Diamo un'occhiata a un esempio di come possiamo implementare un array bidimensionale.
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
L'output del programma sopra sarà mostrato come segue:
10
11
12
Il seguente punto deve essere notato sul programma di cui sopra:
Per creare un array multidimensionale, possiamo utilizzare un altro livello di indicizzazione. Quindi nel nostro esempio, abbiamo usatolist.1.1 per creare un altro array interno per il valore di indice 1 dell'array list.
Finora abbiamo visto dichiarazioni che sono state eseguite una dopo l'altra in modo sequenziale. Inoltre, in Rexx vengono fornite istruzioni per alterare il flusso di controllo nella logica di un programma. Vengono quindi classificati in un flusso di dichiarazioni di controllo che studieremo in dettaglio.
Un'istruzione loop ci consente di eseguire un'istruzione o un gruppo di istruzioni più volte. La seguente illustrazione è la forma generale di un'istruzione loop nella maggior parte dei linguaggi di programmazione.
Parliamo di vari loop supportati da Rexx.
Sr.No. | Tipo e descrizione del loop |
---|---|
1 | fare il ciclo Il do loopviene utilizzato per eseguire un numero di istruzioni per un certo numero di volte. Il numero di volte che l'istruzione deve essere eseguita è determinato dal valore passato al ciclo do. |
2 | ciclo do-while L'istruzione do-while viene utilizzata per simulare il semplice ciclo while presente in altri linguaggi di programmazione. |
3 | ciclo continuo Il ciclo do-until è una leggera variazione del ciclo do while. Questo ciclo varia nel fatto che si esce quando la condizione da valutare è falsa. |
Ripetizione controllata
I cicli do possono essere utilizzati per eseguire una ripetizione controllata di affermazioni.
Sintassi
La sintassi generale di questo tipo di affermazione è la seguente.
do index = start [to limit] [by increment] [for count]
statement #1
statement #2
end
La differenza in questa istruzione è che esiste un indice che viene utilizzato per controllare il numero di volte in cui viene eseguito il ciclo. In secondo luogo, ci sono parametri che stabiliscono il valore con cui dovrebbe iniziare l'indice, dove dovrebbe finire e qual è il valore di incremento.
Diagramma di flusso
Controlliamo il diagramma di flusso di questo ciclo -
Dal diagramma sopra puoi vedere chiaramente che il ciclo viene eseguito in base al valore dell'indice e come viene incrementato il valore dell'indice.
Il seguente programma è un esempio dell'istruzione di ripetizione controllata.
Esempio
/* Main program */
do i = 0 to 5 by 2
say "hello"
end
Nel programma sopra, il valore di count iè impostato prima su 0. Quindi viene incrementato in conteggi di 2 fino a quando il valore non è maggiore di 5.
L'output del codice precedente sarà:
hello
hello
hello
Le strutture decisionali richiedono che il programmatore specifichi una o più condizioni che devono essere valutate o testate dal programma.
Il diagramma seguente mostra la forma generale di una tipica struttura decisionale presente nella maggior parte dei linguaggi di programmazione.
C'è una o più istruzioni da eseguire se la condizione è determinata truee, facoltativamente, altre istruzioni da eseguire se si determina che la condizione è false.
Diamo un'occhiata alle varie dichiarazioni decisionali disponibili in Rexx.
Sr.No. | Dichiarazione e descrizione |
---|---|
1 | If dichiarazione La prima dichiarazione decisionale è il ifdichiarazione. Unif L'istruzione consiste in un'espressione booleana seguita da una o più istruzioni. |
2 | Istruzione if-else La successiva dichiarazione decisionale è la dichiarazione if-else. Unif può essere seguita da un'istruzione else opzionale, che viene eseguita quando l'espressione booleana è falsa. |
Dichiarazioni If annidate
A volte è necessario avere multiple if statementsincorporati l'uno nell'altro, come è possibile in altri linguaggi di programmazione. In Rexx anche questo è possibile.
Sintassi
if (condition1) then
do
#statement1
end
else
if (condition2) then
do
#statement2
end
Diagramma di flusso
Il diagramma di flusso di nidificato if dichiarazioni è la seguente -
Facciamo un esempio di annidato if dichiarazione -
Esempio
/* 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
L'output del programma di cui sopra sarà:
i is greater than 10
Seleziona Dichiarazioni
Rexx offre l'istruzione select che può essere utilizzata per eseguire espressioni basate sull'output dell'istruzione select.
Sintassi
La forma generale di questa dichiarazione è:
select
when (condition#1) then
statement#1
when (condition#2) then
statement#2
otherwise
defaultstatement
end
Il funzionamento generale di questa affermazione è il seguente:
L'istruzione select dispone di un intervallo di istruzioni when per valutare condizioni diverse.
Ogni when clause ha una condizione diversa che deve essere valutata e l'istruzione successiva viene eseguita.
L'istruzione altrimenti viene utilizzata per eseguire qualsiasi istruzione predefinita se le precedenti condizioni when non lo fanno evaluate to true.
Diagramma di flusso
Il diagramma di flusso di select la dichiarazione è la seguente
Il seguente programma è un esempio dell'istruzione case in Rexx.
Esempio
/* 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
L'output del programma di cui sopra sarebbe:
i is greater than 10
Rexx ha i seguenti tipi di dati quando si tratta di numeri.
Integer- Una stringa di valori numerici che non contiene un punto decimale o un identificatore di esponente. Il primo carattere può essere un segno più (+) o meno (-). Il numero rappresentato deve essere compreso tra -2147483648 e 2147483647 inclusi.
Big Integer- Una stringa di numeri che non contiene un punto decimale o un identificatore di esponente. Il primo carattere può essere un segno più (+) o meno (-). Il numero rappresentato deve essere compreso tra -9223372036854775808 e 2147483648 inclusi o tra 2147483648 e 9223372036854775807.
Decimal - Uno dei seguenti formati -
Una stringa di valori numerici che contiene un punto decimale ma nessun identificatore di esponente, dove p rappresenta la precisione e srappresenta la scala del numero decimale rappresentato dalla stringa. Il primo carattere può essere un segno più (+) o meno (-).
Una stringa di valori numerici che non contiene un punto decimale o un identificatore di esponente. Il primo carattere può essere un segno più (+) o meno (-). Il numero rappresentato è minore di -9223372036854775808 o maggiore di 9223372036854775807.
Float- Una stringa che rappresenta un numero in notazione scientifica. La stringa è costituita da una serie di numeri seguiti da un identificatore di esponente (una E o una e seguita da un segno più (+) o meno (-) opzionale e una serie di numeri). La stringa può iniziare con un segno più (+) o meno (-).
Vediamo ora il diverso methods available for numbers.
Sr.No. | Metodi disponibili per i numeri |
---|---|
1 | addominali Questo metodo restituisce il valore assoluto di un numero di input. |
2 | MAX Questo metodo restituisce il valore massimo da un elenco di numeri. |
3 | MIN Questo metodo restituisce il valore minimo da un elenco di numeri. |
4 | CASUALE Questo metodo restituisce un numero generato casuale. |
5 | CARTELLO Restituisce 1 se il numero è maggiore di 0 o 0 se il numero è 0 o -1 se il numero è minore di 0. |
6 | TRUNC Questo metodo tronca un numero. |
Le stringhe in Rexx sono denotate da una sequenza di caratteri. Il seguente programma è un esempio di stringhe:
/* Main program */
a = "This is a string"
say a
L'output del programma di cui sopra è il seguente:
This is a string
Discutiamo alcuni metodi che sono disponibili in Rexx per le stringhe.
Sr.No. | Metodi disponibili in Rexx for Strings |
---|---|
1 | sinistra Questo metodo restituisce un certo numero di caratteri dalla sinistra della stringa. |
2 | destra Questo metodo restituisce un certo numero di caratteri dalla destra della stringa. |
3 | lunghezza Questo metodo restituisce il numero di caratteri nella stringa. |
4 | inversione Questo metodo restituisce i caratteri in un formato inverso. |
5 | confrontare Questo metodo confronta 2 stringhe. Restituisce "0" se "stringa1" e "stringa2" sono identiche. In caso contrario, restituisce la posizione del primo carattere che non corrisponde. |
6 | copie Questo metodo copia un file string n numero di volte. |
7 | substr Questo metodo ottiene una sottostringa da una stringa particolare. |
8 | pos Questo metodo restituisce la posizione di una stringa all'interno di un'altra. |
9 | delstr Questo metodo elimina una sottostringa dall'interno di una stringa. |
Il codice in Rexx è normalmente suddiviso in funzioni e sottoprogrammi. L'utilizzo delle funzioni aiuta a separare il codice in molte più unità logiche. Diamo un'occhiata a queste funzioni in dettaglio.
Definizione di una funzione
La sintassi di una dichiarazione di funzione è la seguente:
FunctionName:
PARSE ARG arguement1, arguement2… arguementN
Return value
Dove,
FunctionName - Questo è il nome assegnato alla funzione.
PARSE ARG - Queste sono parole chiave in Rexx che vengono utilizzate per menzionare che i parametri vengono passati alla funzione.
arguement1, arguement2… arguementN - Questi sono gli argomenti passati alla funzione.
Return value - Questo è il valore restituito dalla funzione.
Il seguente programma è un semplice esempio di come vengono utilizzate le funzioni in Rexx.
/* Main program */
say add(5,6)
exit
add:
PARSE ARG a,b
return a + b
Le seguenti cose dovrebbero essere annotate sul programma di cui sopra:
Stiamo definendo una funzione chiamata add che accetta 2 parametri a e b.
La funzione utilizza l'istruzione return per restituire la somma di a e b.
L'istruzione exit deve essere utilizzata per indicare la fine del programma principale.
L'output del programma di cui sopra sarebbe il seguente:
11
Lavorare con gli argomenti
In Rexx, ci sono funzioni specifiche che possono essere fatte funzionare con gli argomenti. Diamo un'occhiata a un paio di questi argomenti.
arg
Questo metodo viene utilizzato per restituire il numero di argomenti definiti per la funzione.
Syntax -
arg()
Parameters - Nessuno
Return Value - Questo metodo restituisce il numero di argomenti definiti per la funzione.
Example -
/* Main program */
say add(5,6)
exit
add:
PARSE ARG a,b
say arg()
return a + b
Output - Quando eseguiamo il programma sopra, otterremo il seguente risultato.
2
11
arg (indice)
Questo metodo viene utilizzato per restituire il valore dell'argomento nella posizione specifica.
Syntax -
arg(index)
Parameter -
Index - Posizione indice dell'argomento da restituire.
Return Value - Questo metodo restituisce il valore dell'argomento nella posizione specifica.
Example -
/* Main program */
say add(5,6)
exit
add:
PARSE ARG a,b
say arg(1)
return a + b
Output - Quando eseguiamo il programma sopra, otterremo il seguente risultato.
5
11
Funzioni ricorsive
Una funzione o routine ricorsiva è quella che chiama se stessa. Qualsiasi funzione ricorsiva potrebbe essere codificata in un modo tradizionale non ricorsivo (o iterativo), ma a volte la ricorsione offre una migliore soluzione del problema. Non tutti i linguaggi di programmazione supportano la ricorsione; Rexx lo fa.
Vediamo un esempio del famoso programma fattoriale che utilizza funzioni ricorsive in 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 )
L'output del programma di cui sopra è il seguente:
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
Lo stack è talvolta chiamato coda dati esterna, ma seguiamo l'utilizzo comune e lo chiamiamo stack. È un blocco di memoria logicamente esterno a Rexx. Istruzioni come push e queue inseriscono i dati nello stack e istruzioni come pull e parse pull estraggono i dati da esso. La funzione incorporata in coda segnala quanti elementi ci sono nello stack.
Diamo un'occhiata a un esempio di uno stack.
/* 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
Il primo ciclo do nel programma inserisce tre righe di dati nello stack. Usa l'istruzione push per farlo. Numeriamo le righe in modo che quando vengono recuperate nell'ordine LIFO il loro ordine sia evidente.
Gli articoli inseriti nella pila dall'istruzione push vengono recuperati nell'ordine LIFO -
do j = 1 to 3
push ‘Stack: line #’ || j /* push 3 lines onto the stack */
end
Il blocco di codice successivo mostra l'uso della funzione incorporata in coda per scoprire il numero di righe nello stack, nonché un ciclo per recuperare tutte le righe dallo stack -
do j = 1 to queued() /* retrieve and display LIFO */
pull line
say line
end
Poiché i tre elementi sono stati posizionati sulla pila tramite push, vengono recuperati nell'ordine LIFO.
L'output del programma di cui sopra sarà il seguente.
STACK: LINE #3
STACK: LINE #2
STACK: LINE #1
Rexx fornisce una serie di metodi quando si lavora con I / O. Rexx fornisce classi più semplici per fornire le seguenti funzionalità per i file.
- Lettura di file
- Scrittura su file
- Verificare se un file è un file o una directory
Le funzioni disponibili in Rexx per File I / O si basano sia sull'input di riga che sull'input di caratteri e vedremo in dettaglio le funzioni disponibili per entrambi.
Esploriamo alcune delle operazioni sui file che Rexx ha da offrire. Ai fini di questi esempi, assumeremo che esista un file chiamatoNewFile.txt che contiene le seguenti righe di testo -
Example1
Example2
Example3
Questo file verrà utilizzato per le operazioni di lettura e scrittura nei seguenti esempi. Qui discuteremo di come leggere il contenuto di un file in modi diversi.
Leggere il contenuto di un file una riga alla volta
Le operazioni generali sui file vengono effettuate utilizzando i metodi disponibili nella libreria Rexx stessa. La lettura dei file è la più semplice di tutte le operazioni in Rexx.
Diamo un'occhiata alla funzione utilizzata per ottenere ciò.
linein
Questo metodo restituisce una riga dal file di testo. Il file di testo è il nome del file fornito come parametro di input alla funzione.
Syntax -
linein(filename)
Parameter -
filename - Questo è il nome del file da cui deve essere letta la riga.
Return Value - Questo metodo restituisce una riga del file alla volta.
Example -
/* Main program */
line_str = linein(Example.txt)
say line_str
Il codice sopra è piuttosto semplice nel fatto che il file Example.txtil nome del file viene fornito alla funzione linein. Questa funzione quindi legge una riga di testo e fornisce il risultato alla variabileline_str.
Output - Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Example1
Leggere il contenuto di un file in una sola volta
In Rexx, la lettura di tutto il contenuto di un file può essere ottenuta con l'aiuto dell'istruzione while. L'istruzione while leggerà ogni riga, una alla volta fino alla fine del file.
Di seguito è mostrato un esempio di come questo può essere ottenuto.
/* Main program */
do while lines(Example.txt) > 0
line_str = linein(Example.txt)
say line_str
end
Nel programma di cui sopra, è necessario notare le seguenti cose:
La funzione righe legge il file Example.txt file.
La funzione while viene utilizzata per verificare se esistono ulteriori righe nel file Example.txt.
Per ogni riga letta dal file, il line_strvariabile contiene il valore della riga corrente. Questo viene quindi inviato alla console come output.
Output - Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Example1
Example2
Example3
Scrittura di contenuti su un file
Proprio come la lettura di file, Rexx ha anche la capacità di scrivere su file. Diamo un'occhiata alla funzione che viene utilizzata per eseguire ciò.
rimessa laterale
Questo metodo scrive una riga in un file. Il file in cui deve essere scritta la riga viene fornito come parametro per l'istruzione lineout.
Syntax -
lineout(filename)
Parameter -
filename - Questo è il nome del file da cui deve essere scritta la riga.
Return Value- Questo metodo restituisce lo stato della funzione lineout. Il valore restituito è 0 se la riga è stata scritta con successo altrimenti verrà restituito il valore 1.
Example -
/* Main program */
out = lineout(Example.txt,"Example4")
Output - Ogni volta che viene eseguito il codice precedente, la riga "Example4" verrà scritta nel file Example.txt.
In questo capitolo, discuteremo di alcune delle altre funzioni disponibili per i file.
Sr.No. | Funzioni per i file |
---|---|
1 | Linee Questa funzione restituisce il valore 1 o il numero di righe da leggere in un flusso di input. Il nome del file viene fornito come input alla funzione. |
2 | ruscello Questa funzione viene utilizzata per controllare lo stato di un file. A volte è necessario controllare lo stato di un file prima che venga utilizzato. Se il file è danneggiato o non disponibile, non è possibile eseguire ulteriori operazioni sul file. Quindi ha più senso controllare prima lo stato del file. |
3 | charin Questa funzione viene utilizzata per leggere un carattere alla volta da un file. A volte i programmi richiedono di leggere i file in base al carattere e quindi questa funzione può essere utilizzata per questo scopo. |
4 | chars Questa funzione restituisce 1 o il numero di caratteri rimasti da leggere nel file stesso. Il nome del file è menzionato come parametro della funzione. |
5 | charout Questa funzione viene utilizzata per scrivere un carattere alla volta in un file. Il nome del file viene immesso come parametro della funzione. |
In qualsiasi linguaggio di programmazione, l'intero programma è suddiviso in moduli logici. Ciò semplifica la scrittura di codice che può essere mantenuto facilmente. Questo è un requisito fondamentale per qualsiasi linguaggio di programmazione.
In Rexx, i moduli possono essere scritti utilizzando subroutine e funzioni. Diamo un'occhiata alle subroutine in dettaglio.
Definizione di una subroutine
La sintassi di una dichiarazione di funzione è la seguente:
FunctionName:
Statement#1
Statement#2
….
Statement#N
Dove,
FunctionName - Questo è il nome assegnato alla subroutine.
Statement#1 .. Statement#N - Questi sono l'elenco delle istruzioni che compongono la subroutine.
Il seguente programma è un semplice esempio che mostra l'uso delle subroutine.
/* Main program */
call add
exit
add:
a = 5
b = 10
c = a + b
say c
Le seguenti cose dovrebbero essere annotate sul programma di cui sopra:
Stiamo definendo una subroutine chiamata add.
La subroutine esegue una semplice funzionalità di aggiunta.
L'istruzione exit deve essere utilizzata per indicare la fine del programma principale.
L'output del programma di cui sopra sarebbe il seguente:
15
Lavorare con gli argomenti
È anche possibile lavorare con argomenti in Rexx. Il seguente esempio mostra come questo può essere ottenuto.
/* Main program */
call add 1,2
exit
add:
PARSE ARG a,b
c = a + b
say c
Le seguenti cose dovrebbero essere annotate sul programma di cui sopra:
Stiamo definendo una subroutine chiamata add che assume 2 parametri.
Nelle subroutine, i 2 parametri vengono analizzati utilizzando le parole chiave PARSE e ARG.
L'output del programma di cui sopra sarebbe il seguente:
3
Metodi diversi per gli argomenti
Diamo un'occhiata ad alcuni altri metodi disponibili per gli argomenti.
arg
Questo metodo viene utilizzato per restituire il numero di argomenti definiti per la subroutine.
Syntax -
arg()
Parameters - Nessuno
Return Value - Questo metodo restituisce il numero di argomenti definiti per la subroutine.
Example -
/* Main program */
call add 1,2
exit
add:
PARSE ARG a,b
say arg()
c = a + b
say c
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
2
3
arg (indice)
Questo metodo viene utilizzato per restituire il valore dell'argomento nella posizione specifica.
Syntax -
arg(index)
Parameters
Index - Posizione indice dell'argomento da restituire.
Return Value - Questo metodo restituisce il valore dell'argomento nella posizione specifica.
Example -
/* Main program */
call add 1,2
exit
add:
PARSE ARG a,b
say arg(1)
c = a + b
say c
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
1
3
Ogni linguaggio di programmazione ha alcune funzioni integrate che aiutano il programmatore a svolgere alcune attività di routine. Rexx ha anche molte funzioni integrate.
Diamo un'occhiata a tutte queste funzioni disponibili in Rexx.
Sr.No. | Funzioni disponibili in Rexx |
---|---|
1 | INDIRIZZO Questo metodo restituisce il nome dell'ambiente in cui sono attualmente in esecuzione i comandi Rexx. |
2 | BEEP Questo metodo produce un suono nel sistema a una particolare frequenza e durata. |
3 | Tipo di dati Questo metodo restituisce il valore di "NUM" se l'input è un numero valido, altrimenti restituirà il valore di "CHAR". È inoltre possibile specificare se si desidera confrontare il valore di input con un valore NUM o CHAR. In ogni caso, il valore restituito sarà 1 o 0 a seconda del risultato. |
4 | DATA Questo metodo restituisce la data locale nel seguente formato. |
5 | CIFRE Questo metodo restituisce l'impostazione corrente di CIFRE NUMERICHE come definito nel sistema corrente. |
6 | ERRORTEXT Questo metodo restituisce il messaggio di errore Rexx associato al numero di errore "errorno". Si noti che il numero di errore deve essere un valore compreso tra 0 e 99. Ciò è utile nei casi in cui il programma ha restituito un codice di errore e si desidera sapere cosa significa il codice di errore. |
7 | MODULO Questo metodo restituisce l'impostazione corrente di "MODULO NUMERICO" utilizzato per eseguire calcoli matematici sul sistema. |
8 | TEMPO Questo metodo restituisce l'ora locale nel formato a 24 ore come mostrato nel seguente programma. |
9 | ID UTENTE Questo metodo restituisce l'ID utente corrente connesso al sistema. |
10 | XRANGE Questo metodo restituisce i caratteri nell'intervallo specificato dal carattere iniziale e finale. |
11 | X2D Questo metodo restituisce la conversione decimale di un file hexstring value. |
12 | X2C Questo metodo restituisce la conversione dei caratteri di un valore hexstring. |
Uno dei maggiori vantaggi di Rexx è la possibilità di creare script riutilizzabili. Spesso nelle organizzazioni al giorno d'oggi, avere script riutilizzabili è un grande valore aggiunto per risparmiare tempo per svolgere attività ripetitive comuni.
Ad esempio, i team tecnologici di un'organizzazione IT possono avere la necessità di disporre di script che eseguono attività quotidiane comuni. Queste attività possono includere l'interazione con i sistemi operativi. Questi script possono quindi essere programmati per gestire errori o codici di ritorno non validi.
Rexx offre molti comandi di sistema che possono essere utilizzati per eseguire tali attività ripetitive. Diamo un'occhiata ad alcuni dei comandi di sistema disponibili in Rexx.
dir
Questo è il normale comando di elenco delle directory utilizzato in Windows.
Sintassi
dir
Parametri
Nessuna
Valore di ritorno
Questo metodo restituisce l'elenco di directory corrente sul sistema.
Esempio
/* Main program */
dir
L'output dipende dalla directory nel sistema.
Il seguente programma è solo un esempio.
Produzione
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
Un altro esempio di dir commandè mostrato nel seguente programma. Solo che questa volta utilizziamo il filespecial rc variable. Questa variabile è speciale in Rexx e fornisce lo stato di esecuzione dei comandi di sistema. Se il valore restituito è 0, significa che il comando è stato eseguito correttamente. Altrimenti il numero di errore verrà fornito nel nome della variabile rc.
Esempio
/* Main program */
dir
if rc = 0 then
say 'The command executed successfully'
else
say 'The command failed, The error code is =' rc
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
The command failed, The error code is = 127
Comandi di reindirizzamento
Rexx ha anche la possibilità di utilizzare i comandi di reindirizzamento. I seguenti comandi di reindirizzamento sono disponibili in Rexx.
< - Questo comando viene utilizzato per ricevere l'input che proviene da un file.
>- Questo comando viene utilizzato per produrre il contenuto in un file. Se il file esiste, verrà sovrascritto.
>>- Viene anche utilizzato per l'output del contenuto in un file. Ma l'output viene aggiunto alla fine del file per preservare il contenuto esistente del file.
Diamo un'occhiata a un esempio di come possiamo usare i comandi di reindirizzamento. Nell'esempio seguente, stiamo usando il comando sort per ordinare un file chiamatosortin.txt. I dati del file vengono inviati al comando di ordinamento. L'output del comando di ordinamento viene quindi inviato al file sortout.txt.
Esempio
/* Main program */
'sort <sortin.txt> sortout.txt'
Supponiamo che il file sortin.txt contenga i seguenti dati.
Produzione
b
c
a
Il file sortout.txt avrà quindi i seguenti dati.
a
b
c
La funzione ADDRESS
Questo metodo viene utilizzato per scoprire qual è l'ambiente predefinito utilizzato per i flussi di input, errore e output.
Sintassi
ADDRESS(options)
Parametri
Opzioni per qual è l'indirizzo di un particolare sistema.
Valore di ritorno
Questo metodo restituisce il nome dell'ambiente per i flussi di input, errore e output.
Esempio
/* Main program */
say ADDRESS('I')
say ADDRESS('O')
say ADDRESS('E')
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
INPUT NORMAL
REPLACE NORMAL
REPLACE NORMAL
XML è un linguaggio portatile e open source che consente ai programmatori di sviluppare applicazioni che possono essere lette da altre applicazioni, indipendentemente dal sistema operativo e / o dal linguaggio di sviluppo. Questa è una delle lingue più comuni utilizzate per lo scambio di dati tra le applicazioni.
Cos'è l'XML?
L'XML Extensible Markup Language è un linguaggio di markup molto simile a HTML o SGML. Questo è consigliato dal World Wide Web Consortium e disponibile come standard aperto. XML è estremamente utile per tenere traccia di piccole e medie quantità di dati senza richiedere un backbone basato su SQL.
Per tutti i nostri esempi di codice XML, utilizziamo il seguente semplice file XML movies.xml per la costruzione del file XML e la successiva lettura del file.
<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>
Iniziare
Per impostazione predefinita, la funzionalità xml non è inclusa nell'interprete Rexx. Per lavorare con XML in Rexx, è necessario seguire i seguenti passaggi.
Scarica i seguenti file:
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/
Estrai tutti i file e assicurati che siano inclusi nel percorso di sistema.
Caricamento di funzioni XML
Una volta che tutti i file nella sezione precedente sono stati scaricati e registrati con successo, il passo successivo è scrivere il codice per caricare le funzioni XML Rexx. Questo viene fatto con il codice seguente.
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
Le seguenti cose possono essere notate sul programma di cui sopra:
La funzione rxfuncaddviene utilizzato per caricare librerie esterne. Ilxmlloadfuncs viene utilizzata per caricare tutte le librerie nel file rexxxml file in memoria.
Se il valore di rcc <> 0, risulterebbe in un errore. Per questo, possiamo chiamare il filerxfuncerrmsg per fornirci maggiori dettagli sul messaggio di errore.
Finalmente facciamo una chiamata a xmlloadfuncs, in modo che tutte le funzionalità relative a xml possano ora essere abilitate nel programma Rexx.
Diamo un'occhiata ai vari methods available for XML in Rexx.
xmlVersion
Questo metodo restituisce la versione delle librerie XML e XSLT utilizzate nel sistema.
Sintassi
xmlVersion()
Parametri
Nessuna
Valore di ritorno
Questo metodo restituisce la versione delle librerie XML e XSLT utilizzate nel sistema.
Esempio
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
say xmlVersion()
Quando eseguiamo il programma sopra, otterremo il seguente risultato. Questo dipende ancora dalla versione delle librerie XML utilizzate nel sistema.
Produzione
1.0.0 20631 10126
xmlParseXML
Questa funzione viene utilizzata per analizzare i dati XML inviati alla funzione. L'albero del documento viene restituito dalla funzione.
Sintassi
xmlParseXML(filename)
Parametri
Filename - Questo è il nome del file XML che deve essere analizzato.
Valore di ritorno
L'albero del documento viene restituito dalla funzione. Altrimenti restituisce 0, in caso di errore.
Esempio
rcc = rxfuncadd('XMLLoadFuncs', 'rexxxml', 'xmlloadfuncs')
if rcc then do
say rxfuncerrmsg()
exit 1
end
call xmlloadfuncs
say xmlVersion()
sw = xmlParseXML('test.xml')
Produzione
Nessun output generale.
xmlFindNode
Questo metodo valuta il XPath expressionpassato ad esso. Viene utilizzato per analizzare l'albero del documento per ottenere un filenodeset che può essere ulteriormente elaborato.
Sintassi
xmlParseXML(XPath,document)
Parametri
XPath - Questo è il percorso del nodo nel file xml.
document - Questo è il documento XML
Valore di ritorno
Valuta l'espressione XPath e restituisce il risultato come un set di nodi che può essere utilizzato in seguito.
Esempio
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 eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
4
L'output mostra il numero di nodi del film nel nostro elenco xml
xmlEvalExpression
Il metodo seguente viene utilizzato per valutare un'espressione XPath e restituire una stringa come risultato.
Sintassi
xmlParseXML(XPath,Node)
Parametri
XPath - Questo è il percorso del nodo nel file xml.
document - L'elemento nodo specifico.
Valore di ritorno
Viene restituita una stringa in base all'espressione XPath inviata.
Esempio
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 eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
War, Thriller
Anime, Science Fiction
Anime, Action
Comedy
Regina è un altro interprete Rexx disponibile per compilare ed eseguire programmi Rexx. Il sito ufficiale di Regina è - www.regina-rexx.sourceforge.net/
Alcuni dei vantaggi dell'utilizzo di Regina sono i seguenti:
Regina può funzionare su qualsiasi piattaforma sia che sia Windows, Linux o Mac OS.
Regina funziona secondo tutti gli standard disponibili.
Regina ha una grande comunità di seguaci e quindi ci sono molti forum e materiale didattico disponibile per Regina.
Regina ha molti strumenti disponibili per scrivere e testare i programmi Rexx.
In Regina, puoi eseguire comandi che non sono possibili nel Rexx Interpreter predefinito. Ad esempio, se includi determinate impostazioni di configurazione, puoi effettivamente eseguire comandi a livello di sistema di base, il che non è possibile in Rexx.
Quando installi Rexx tramite l'installazione documentata in Chapter 2 – Rexx Environment, insieme ad esso viene installato l'interprete Regina.
Vediamo ora alcuni dei metodi comuni disponibili quando si utilizza Regina. Queste funzioni sono le funzioni estese che non sono disponibili durante il normale utilizzo.
Per utilizzare le funzioni estese, è necessario includere la seguente riga di codice. Ciò consente l'utilizzo delle funzioni estese di Regina.
options arexx_bifs
In secondo luogo, durante l'esecuzione di tutti i programmi Rexx, utilizzare il seguente comando.
regina main.rexx
Where,
regina - Questo è l'interprete utilizzato per i programmi Rexx.
main.rexx - Il tuo programma Rexx.
Discuteremo ora in dettaglio i vari functions of Regina Rexx Interpreter.
Sr.No. | Funzioni dell'interprete Regina Rexx |
---|---|
1 | b2c Questo metodo viene utilizzato per convertire un valore binario in un valore stringa. |
2 | bitcomp Il metodo viene utilizzato per confrontare stringhe a 2 bit, bit per bit. |
3 | bittst Questo metodo viene utilizzato per indicare lo stato del bit specificato nella stringa di bit. |
4 | trova Questo metodo viene utilizzato per cercare la prima occorrenza di una stringa in un'altra stringa. |
5 | getenv Questo metodo restituisce il valore di una variabile di ambiente sul sistema. |
6 | getpid Questo metodo viene utilizzato per ottenere il valore dell'ID del processo in esecuzione corrente. |
7 | hash Questo metodo restituisce l'attributo hash di una stringa come numero decimale. Aggiorna anche il valore hash interno della stringa. |
8 | giustificare Questo metodo viene utilizzato per aggiungere giustificare o tagliare il valore di una stringa in base al valore della lunghezza. |
9 | putenv Questo metodo viene utilizzato per impostare il valore di una variabile di ambiente. |
10 | directory Questo metodo ottiene il valore della directory corrente sul sistema. |
11 | chdir Questo metodo modifica il valore della directory di lavoro corrente sul sistema. |
12 | randu Questo metodo restituisce un numero pseudocasuale compreso tra 0 e 1. |
Una delle caratteristiche più potenti di Rexx è la sua capacità di analizzare i valori di testo. Probabilmente non lo vedrai in nessun altro linguaggio di programmazione.
Il formato generale dell'istruzione parse è il seguente:
Sintassi
PARSE {UPPER|LOWER|CASELESS} source {template}
Where,
UPPER - La sorgente viene convertita in lettere maiuscole prima dell'analisi.
LOWER - La sorgente viene convertita in minuscolo prima dell'analisi.
CASELESS - Quando questo parametro viene passato, l'involucro viene ignorato.
source- Questa è la fonte che deve essere analizzata. Ci sono molte opzioni disponibili per questo e può essere una delle seguenti:
ARG - Gli argomenti per il programma o la procedura possono essere utilizzati come origine.
LINEIN - L'ingresso di linea successivo può essere utilizzato come sorgente.
SOURCE - Le informazioni sulla fonte del programma possono essere utilizzate come fonte.
VAR name - Il valore di un nome di variabile può essere utilizzato come origine.
template- Questo parametro specifica come analizzare l'origine. Ci sono molte opzioni disponibili per questo. Alcuni di loro sono menzionati di seguito.
variable name - Questo è il valore assegnato alla variabile.
literal string - Una stringa letterale che può essere utilizzata come modello per dividere la corda.
#- Una posizione di carattere assoluta all'interno della sorgente stessa. Quindi, se si specifica un valore di 5, il 5 ° verrà utilizzato il carattere.
+#- Una posizione relativa del carattere all'interno della sorgente stessa. Quindi, se specifichi un valore di 5, il 5 ° carattere verrà utilizzato relativamente.
Diamo un'occhiata a un semplice esempio di come l'analisi può essere eseguita in Rexx.
Esempio
/* Main program */
parse value 'This is a Tutorial' with word1 word2 word3 word4
say "'"word1"'"
say "'"word2"'"
say "'"word3"'"
say "'"word4"'"
Il programma precedente analizza le parole nella frase. Quando un valore è costituito da parole separate da un solo spazio e non sono presenti spazi iniziali o finali, è facile analizzare il valore in un numero noto di parole come segue.
La funzione di analisi viene utilizzata in Rexx per prendere un valore di stringa e quindi scomporlo in parole. Nell'esempio precedente, le parole vengono quindi divise e quindi memorizzate nelle variabili parola.
L'output del programma di cui sopra sarebbe il seguente:
'This'
'is'
'a'
'Tutorial'
Un altro esempio di analisi è mostrato nel seguente programma. Questa volta stiamo usando una clausola while per eseguire l'analisi.
Esempio
/* Main program */
phrase = 'This is a Tutorial'
do while phrase <> ''
parse var phrase word phrase
say "'"word"'"
end
Il programma sopra darà il seguente output:
'This'
'is'
'a'
'Tutorial'
Analisi di posizione
Rexx consente anche di lavorare con l'analisi posizionale. Vediamo un esempio di come possiamo ottenere l'analisi posizionale con l'istruzione parse.
Esempio
/* 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
Dall'esempio sopra, puoi notare che insieme al nome della variabile, stiamo anche specificando dove deve finire la stringa. Quindi per name1, dovremmo terminare con l'undicesimo carattere e quindi iniziare l'analisi di name2.
L'output del programma di cui sopra sarà il seguente:
Doe
John M.
03/03/78
Mumbai
India
Puoi anche usare relative positional parsing in questo caso.
Esempio
/* 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
L'output del programma di cui sopra sarà come mostrato di seguito.
Doe
John M.
03/03/78
Mumbai
India
In Rexx, l'istruzione di segnale viene utilizzata generalmente per due scopi, che sono:
Uno è trasferire il controllo a un'altra parte del programma. Questo è normalmente come l'etichetta di riferimento che viene utilizzata in altri linguaggi di programmazione.
L'altro è andare a una specifica etichetta trap.
Se il comando del segnale viene utilizzato in uno dei seguenti comandi di istruzione, le strutture di controllo in sospeso verranno automaticamente disattivate.
se ... allora ... altro ...
fare ... finire
do i = 1 to n ... end [e simili cicli do]
selezionare quando ... poi ... ... ecc. altrimenti ... fine
La sintassi generale dell'istruzione signal è mostrata come segue:
Sintassi
signal labelName
signal [ VALUE ] labelExpression
Diamo un'occhiata a un esempio di come utilizzare la dichiarazione di segnale.
Esempio
/* 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'
L'output del programma di cui sopra sarà come mostrato di seguito.
Produzione
This is an incorrect number.
Se si modifica il valore della variabile n in un numero intero come mostrato nel programma seguente:
/* 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 '
Otterrai il seguente output:
This is a whole number
Si può anche trasferire al valore dell'etichetta come mostrato nel seguente programma:
/* 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
L'output del programma sopra sarà mostrato come segue:
This is the number 1
Attivazione / disattivazione trasferimento etichetta trap
Come accennato in precedenza, l'istruzione del segnale può essere utilizzata anche per trasferire il controllo a un'etichetta trap.
La sintassi generale del trasferimento dell'etichetta Trap è fornita come segue:
Sintassi
signal ON conditionName [ NAME Label ]
signal OFF conditionName
Dove,
conditionName - Questa è la condizione per la quale il segnale deve essere attivato o disattivato.
Label - L'etichetta opzionale a cui deviare il programma.
Vediamo un esempio di utilizzo di un trasferimento di etichette trap.
Esempio
/* 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'
Nell'esempio precedente, per prima cosa attiviamo i segnali di errore. Aggiungiamo quindi una dichiarazione che risulterà in un errore. Abbiamo quindi l'etichetta di trap di errore per visualizzare un messaggio di errore personalizzato.
L'output del programma di cui sopra sarà il seguente:
An error has occurred.
Il debug è una caratteristica importante in qualsiasi linguaggio di programmazione. Aiuta lo sviluppatore a diagnosticare gli errori, trovare la causa principale e quindi risolverli di conseguenza. In Rexx, l'utilità di traccia viene utilizzata per il debug. L'istruzione trace può essere implementata in 2 modi, uno è la modalità batch e l'altro è la modalità interattiva. Diamo un'occhiata a come implementare entrambe le opzioni.
Traccia in modalità batch
Il comando trace viene utilizzato per fornire un livello dettagliato di ogni comando Rexx che viene eseguito.
La sintassi generale dell'istruzione trace è mostrata come segue:
Sintassi
trace [setting]
Dove l'impostazione può essere una delle seguenti opzioni:
A - Traccia tutti i comandi.
C - Traccia solo i comandi host che vengono inviati al sistema operativo.
E - Traccia solo i comandi host inviati al sistema operativo che hanno generato un errore.
F - Traccia solo i comandi host inviati al sistema operativo che hanno provocato un errore.
I - Fornisce una traccia di livello intermedio dei comandi Rexx.
L - Questa opzione è se desideri etichettare la traccia mentre accade.
N - Questa è l'opzione predefinita in cui non viene eseguita alcuna traccia.
Diamo un'occhiata a un esempio del comando trace.
Esempio
/* 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 '
L'output del programma di cui sopra sarà il seguente:
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
Dall'output è possibile vedere che un'ulteriore traccia è stata aggiunta all'output del programma. Si possono notare le seguenti cose sull'output:
Il numero di riga insieme all'istruzione eseguita viene aggiunto all'output di traccia.
Ogni riga che viene eseguita viene mostrata nell'output della traccia.
Funzione di traccia
Trace può essere abilitato anche con l'aiuto della funzione trace. La sintassi generale e l'esempio sono mostrati di seguito.
Sintassi
trace()
La funzione precedente restituisce il livello di traccia corrente.
Parametri
Nessuna
Valore di ritorno
La funzione sopra fornisce il livello di traccia corrente.
Esempio
/* 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 '
L'output del programma di cui sopra sarà il seguente.
N
This is an incorrect number
La prima riga di N indica che la traccia è impostata su Normale.
Impostazione del valore di traccia
Il livello di traccia può essere impostato con la funzione di traccia. La sintassi generale e l'esempio sono mostrati di seguito.
Sintassi
trace(travel_level)
Parametri
trace_level - Questo è simile alle opzioni disponibili per impostare il livello di traccia.
Valore di ritorno
La funzione sopra fornisce il livello di traccia corrente.
Esempio
/* 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 '
L'output del programma di cui sopra sarà il seguente:
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'
Traccia interattiva
La traccia interattiva è in cui la traccia viene eseguita durante l'esecuzione del programma. Proprio come in un IDE come Visual Studio per .Net, in cui puoi aggiungere punti di interruzione e vedere come viene eseguita ciascuna istruzione, allo stesso modo anche qui puoi vedere il programma mentre viene eseguita ogni riga di codice.
La sintassi generale è la seguente:
Sintassi
trace ?options
Dove, le opzioni sono le stesse per il comando trace come mostrato di seguito.
A - Traccia tutti i comandi
C - Traccia solo i comandi host che vengono inviati al sistema operativo.
E - Traccia solo i comandi host inviati al sistema operativo che hanno generato un errore.
F - Traccia solo i comandi host inviati al sistema operativo che hanno provocato un errore.
I - Fornisce una traccia di livello intermedio dei comandi Rexx.
L - Questa opzione è se desideri etichettare la traccia mentre accade.
N - Questa è l'opzione predefinita in cui non viene eseguita alcuna traccia.
Diamo un'occhiata a un esempio di implementazione della traccia attiva.
Esempio
/* 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'
L'output del programma sopra sarà come mostrato nel programma seguente. La traccia si fermerà a ogni riga di codice; quindi è necessario premere il pulsante Invio per passare alla riga di codice successiva.
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 ha la capacità di lavorare anche sulla gestione degli errori come in altri linguaggi di programmazione.
Le seguenti sono alcune delle varie condizioni di errore che si vedono in Rexx.
ERROR - Viene anche sollevato ogni volta che un comando inviato al sistema operativo restituisce un errore.
FAILURE - Viene anche sollevato ogni volta che un comando inviato al sistema operativo risulta in un errore.
HALT- Viene normalmente generato ogni volta che un'operazione dipende da un'altra operazione. Un esempio è se un'operazione di I / O viene interrotta per qualsiasi motivo.
NOVALUE - Questo evento viene generato quando un valore non è stato assegnato a una variabile.
NOTREADY - Viene generato da qualsiasi dispositivo I / O che non è pronto ad accettare alcuna operazione.
SYNTAX - Questo evento viene generato se è presente un errore di sintassi nel codice.
LOSTDIGITS - Questo evento viene generato quando un'operazione aritmetica comporta una perdita di cifre durante l'operazione.
Errori di trapping
Gli errori vengono bloccati con l'aiuto del comando signal. Diamo un'occhiata alla sintassi e un esempio di questo.
Sintassi
signal on [Errorcondition]
Dove,
Errorcondition - Questa è la condizione di errore riportata sopra.
Esempio
Diamo un'occhiata a un esempio su questo.
/* 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'
Nell'esempio precedente, per prima cosa attiviamo i segnali di errore. Aggiungiamo quindi una dichiarazione che risulterà in un errore. Abbiamo quindi l'etichetta di trap di errore per visualizzare un messaggio di errore personalizzato.
L'output del programma di cui sopra sarà come mostrato di seguito.
An error has occurred.
Un esempio di codici di errore è mostrato nel seguente programma.
/* 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
L'output del programma di cui sopra sarà come mostrato di seguito.
An error has occured
40
6
Quando installi ooRexx secondo il capitolo sull'ambiente, avrai anche la possibilità di lavorare con classi e oggetti. Tieni presente che tutto il codice seguente deve essere eseguito nell'interprete ooRexx. Il normale interprete Rexx non sarà in grado di eseguire questo codice orientato agli oggetti.
Dichiarazioni di classe e metodo
Una classe viene definita con la seguente dichiarazione di sintassi.
Sintassi
::class classname
dove classname è il nome dato alla classe.
Un metodo in una classe viene definito con la seguente dichiarazione di sintassi.
Sintassi
::method methodname
Dove methodname è il nome dato al metodo.
Una proprietà in una classe viene definita con la seguente dichiarazione di sintassi.
Sintassi
::attribute propertyname
Dove propertyname è il nome dato alla proprietà.
Esempio
Quello che segue è un esempio di una classe in Rexx.
::class student
::attribute StudentID
::attribute StudentName
I seguenti punti devono essere annotati riguardo al programma di cui sopra.
- Il nome della classe è studente.
- La classe ha 2 proprietà, StudentID e StudentName.
Metodi Getter e Setter
I metodi Getter e Setter vengono utilizzati per impostare e ottenere automaticamente i valori delle proprietà. In Rexx, quando dichiari una proprietà con la parola chiave attribute, i metodi getter e setter sono già messi in atto.
Esempio
::class student
::attribute StudentID
::attribute StudentName
Nell'esempio precedente, ci sarebbero metodi Getter e Setter per StudentId e StudentName.
Un esempio di come possono essere utilizzati è mostrato nel seguente programma.
/* 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
L'output del programma di cui sopra sarà come mostrato di seguito.
1
Joe
Metodi di istanza
Gli oggetti possono essere creati dalla classe tramite ~new operator. Un metodo della classe può essere chiamato nel modo seguente.
Object~methodname
Dove methodname è il metodo che deve essere invocato dalla classe.
Esempio
L'esempio seguente mostra come creare un oggetto da una classe e richiamare il rispettivo metodo.
/* 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))
L'output del programma di cui sopra sarà come mostrato di seguito.
60
Creazione di più oggetti
Si possono anche creare più oggetti di una classe. Il seguente esempio mostrerà come questo può essere ottenuto.
Qui stiamo creando 3 oggetti (st, st1 e st2) e chiamando i loro membri di istanza e metodi di istanza di conseguenza.
Diamo un'occhiata a un esempio di come possono essere creati più oggetti.
Esempio
/* 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))
L'output del programma di cui sopra sarà come mostrato di seguito.
60
70
60
Eredità
L'ereditarietà può essere definita come il processo in cui una classe acquisisce le proprietà (metodi e campi) di un'altra. Con l'uso dell'ereditarietà, le informazioni vengono rese gestibili in ordine gerarchico.
La classe che eredita le proprietà di altri è nota come subclass (classe derivata, classe figlia) e la classe le cui proprietà sono ereditate è nota come superclass (classe base, classe genitore).
Vediamo un esempio di eredità in Rexx. Nell'esempio seguente stiamo creando una classe chiamataPerson. Da lì usiamo la parola chiave sottoclasse per creare il fileStudent class come un sub-class of Person.
Esempio
/* 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))
L'output del programma di cui sopra sarà come mostrato di seguito.
60
La portabilità è un aspetto importante in qualsiasi linguaggio di programmazione. Come si sa, Rexx è disponibile in una varietà di sistemi operativi come Windows e Linux. Quindi è necessario assicurarsi che quando si sviluppa un programma sulla piattaforma Windows, si adottino le precauzioni necessarie se gli stessi programmi vengono eseguiti su una piattaforma Linux.
Rexx ha la capacità di eseguire comandi a livello di sistema. Ci sono comandi che possono essere usati per capire qual è il sistema operativo su cui è in esecuzione. In base all'output può quindi intraprendere le azioni appropriate per vedere quali sono i comandi che possono essere eseguiti su questo sistema operativo.
Esempio
L'esempio seguente mostra come vengono utilizzate le funzioni di analisi per ottenere i dettagli del sistema operativo su cui è in esecuzione il programma.
/* 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
L'output varierà a seconda del sistema operativo. Di seguito viene fornito un output di esempio.
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 fornisce una serie di funzioni estese che offrono un'ampia varietà di funzionalità, la maggior parte delle quali consente di interagire con il sistema operativo. Vediamone alcuni in dettaglio come spiegato di seguito.
Sr.No. | Funzioni estese |
---|---|
1 | b2c Questa funzione converte un valore binario in un valore stringa. |
2 | bitclr Questa funzione viene utilizzata per impostare il bit specificato nella stringa binaria su 0. |
3 | bitcomp Questa funzione viene utilizzata per confrontare 2 stringhe binarie che iniziano con il bit 0. |
4 | buftype Questa funzione viene utilizzata per visualizzare il contenuto dello stack che viene normalmente utilizzato a scopo di debug. |
5 | cripta Questa funzione viene utilizzata per crittografare una stringa. |
6 | forchetta Questa funzione viene utilizzata per generare un nuovo processo figlio nel sistema. |
7 | getpid Questa funzione ottiene l'id del processo in esecuzione corrente. |
8 | hash Questa funzione restituisce il valore hash di una stringa. |
Rexx fornisce una serie di istruzioni che offrono un'ampia varietà di funzionalità, la maggior parte delle quali consente di interagire con il sistema operativo. Vediamone alcuni in dettaglio.
Sr.No. | Istruzioni Rexx |
---|---|
1 | indirizzo Questa funzione viene utilizzata per visualizzare l'ambiente di comando corrente. |
2 | far cadere Questa funzione viene utilizzata per annullare l'assegnazione di una variabile. |
3 | interpretare Interpreta o esegue l'istruzione definita. |
4 | nop Questa funzione significa non eseguire alcuna operazione. Questo comando è normalmente utilizzato inif statements. |
5 | Tirare Viene utilizzato per estrarre l'input dallo stack o dal flusso predefinito. |
6 | Spingere Viene utilizzato per inserire un valore nello stack Rexx. |
Il linguaggio Rexx ha molte implementazioni diverse come abbiamo già visto nei capitoli precedenti. Ogni implementazione ha le sue funzionalità. Diamo un'occhiata alle varie implementazioni disponibili per Rexx.
OoRexx
Questa è la versione orientata agli oggetti di Rexx. Per impostazione predefinita, l'implementazione di base di Rexx è tutta basata su procedure. Ma con ooRexx puoi offrire una maggiore flessibilità avendo un approccio orientato agli oggetti a Rexx. Usando ooRexx puoi avere un migliore riutilizzo attraverso la creazione di classi e oggetti riutilizzabili.
Il seguente programma è un esempio di un semplice programma Rexx che può essere eseguito con l'implementatore ooRexx.
Esempio
/* Main program */
say ‘hello’
Per eseguire questo programma, eseguire il seguente comando.
rexx main.rexx
Quando esegui il comando precedente, otterrai il seguente output.
hello
Netrexx
Questo è per tutti gli sviluppatori basati su Java in quanto fornisce un'alternativa basata su Java per il linguaggio Rexx. Quindi tutti gli oggetti sono basati sul Java Object Model. Il vantaggio di questo framework è che poiché Java è un linguaggio ampiamente diffuso, diventa più facile per gli sviluppatori utilizzare questo framework. Quindi, in questa implementazione, il codice Rexx viene convertito in un programma Java che può quindi essere eseguito su qualsiasi macchina virtuale Java.
Il codice seguente è un esempio di un programma NetRexx.
Crea un file chiamato main.nrx e inserisci il codice seguente nel file.
/* Main program */
say ‘hello’
Per compilare il codice eseguire il comando seguente:
NetRexxC main.nrx
Otterrai quindi il seguente output. NetRexxC è il compilatore che converte il programma Rexx nel suo equivalente 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
È ora possibile eseguire il programma java utilizzando il seguente comando java.
java main
Quando esegui il comando precedente, otterrai il seguente output.
Hello
Brexx
Questa è un'implementazione leggera di Rexx. Questo è un pacchetto più leggero rispetto all'implementatore Rexx standard. Ma ha ancora la piena funzionalità di Rexx.
Il codice seguente è un esempio di un programma BRexx.
/* Main program */
say ‘hello’
Per eseguire il programma, eseguire il seguente comando.
rexx32 main.rexx
Quando esegui il comando precedente, otterrai il seguente output.
hello
NetRexx è l'implementazione java di Rexx. In NetRexx, l'implementatore viene utilizzato per convertire il programma Rexx in un programma java che può quindi essere eseguito su qualsiasi macchina virtuale Java.
Configurazione di NetRexx
Il primo passaggio in NetRexx è configurarlo sulla macchina locale. Per fare ciò, è necessario eseguire i seguenti passaggi:
Step 1 - Vai al sito di download di NetRexx - http://www.netrexx.org/downloads.nsp
Scarica il file NetRexx.3.04.GA.
Step 2- Assicurati che java sia installato e in esecuzione sul tuo sistema. È possibile verificare che java sia in esecuzione utilizzando il comando java – version.
Di seguito è riportato un esempio dell'output.
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- Decomprimere il contenuto del file zippato Netrexx. Copiare i file dalla cartella NetRexx3.04GA \ lib nella cartella di installazione di java / lib / ecc.
Step 4 - Aggiungere il percorso NetRexx-3.04GA \ bin alla variabile di percorso sul sistema.
Esecuzione del primo programma NetRexx
Crea un file chiamato main.nrx e inserisci il codice seguente nel file.
/* Main program */
say ‘hello’
Per compilare il codice eseguire il comando seguente.
NetRexxC main.nrx
Otterrai quindi il seguente output. NetRexxC è il compilatore che converte il programma rexx nel suo equivalente 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
È ora possibile eseguire il programma java utilizzando il seguente comando java.
java main
Quando esegui il comando precedente, otterrai il seguente output.
Hello
Parliamo ora di alcuni dei special aspects of the Netrexx library.
Stringhe indicizzate
In NetRexx, le stringhe possono diventare gli indici degli array. Di seguito è mostrato un esempio.
Esempio
/* Main program */
value = 'unknown'
value['a'] = 'b'
c = 'a'
say value[c]
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
b
Indici multipli
In NetRexx, puoi avere più indici per gli array. Di seguito è mostrato un esempio.
Esempio
/* Main program */
value = 'null'
value['a', 'b'] = 1
say value['a', 'b']
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
Produzione
1
Sr.No. | Comando e descrizione |
---|---|
1 | chiedi al comando Questo comando viene utilizzato per leggere una riga dal flusso di input predefinito. |
2 | Comando cifre Questo comando viene utilizzato per visualizzare il valore corrente del valore delle cifre. |
3 | form Command Questo comando viene utilizzato per visualizzare il valore corrente del valore del modulo. |
4 | Comando di lunghezza Questo comando viene utilizzato per visualizzare la lunghezza di un valore stringa. |
5 | comando versione Questo comando viene utilizzato per restituire la versione corrente di NetRexx in uso. |
6 | comando trace Questo comando viene utilizzato per restituire l'impostazione di traccia corrente utilizzata da NetRexx. |
BRexx è un'implementazione più leggera di Rexx. Ha ancora molte funzionalità da offrire come parte dell'implementazione di Rexx.
Configurazione di BRexx
Il primo passaggio in BRexx è configurarlo sulla macchina locale. Per fare ciò, è necessario eseguire i seguenti passaggi:
Step 1 - Vai al sito di download di BRexx - https://ftp.gwdg.de/pub/languages/rexx/brexx/html/rx.html
Vai alla sezione download e scarica il prodotto.
Step 2 - Decomprimere il contenuto del file zip Brexx.
Step 3 - Aggiungere il percorso BRexx \ bin alla variabile del percorso sul sistema.
Step 4 - Crea una nuova variabile chiamata RXLIB e indirizzala alla cartella lib nella cartella Brexx.
Esecuzione del primo programma BRexx
Crea un file chiamato main.rexx e inserisci il codice seguente nel file.
/* Main program */
say ‘hello’
Per eseguire il programma, eseguire il seguente comando.
rexx32 main.rexx
Quando esegui il comando precedente, otterrai il seguente output.
hello
Parliamo ora di alcune delle funzioni più comunemente usate disponibili nella libreria BRexx.
Sr.No. | Funzioni disponibili nella libreria BRexx |
---|---|
1 | Comando acos Questo comando viene utilizzato per ottenere la conversione arcocoseno di un numero. |
2 | cos Command Questo comando viene utilizzato per ottenere la conversione del coseno di un numero. |
3 | Comando peccato Questo comando viene utilizzato per ottenere la conversione seno di un numero. |
4 | asin Command Questo comando viene utilizzato per ottenere la conversione arco-seno di un numero. |
5 | Comando tan Questo comando viene utilizzato per ottenere la conversione tangente di un numero. |
6 | Atan Command Questo comando viene utilizzato per ottenere la conversione arco tangente di un numero. |
7 | Comando mkdir Questo comando viene utilizzato per creare una directory nella directory di lavoro corrente. |
8 | Comando rmdir Questo comando viene utilizzato per rimuovere una directory nella directory di lavoro corrente. |
9 | dir Command Questo comando viene utilizzato per restituire l'intero elenco di directory. |
Rexx ha la capacità di lavorare con una varietà di database elencati di seguito.
- HSQLDB
- Oracle
- server SQL
- MySQL
- MongoDB
Tutte le informazioni per i database Rexx possono essere trovate dopo aver fatto clic sul seguente collegamento - https://rexxsql.sourceforge.net/
Nel nostro esempio, useremo MySQL DB come esempio. Quindi il primo passo è assicurarsi di scaricare i driver richiesti dal sito Rexx SQL in modo che i programmi Rexx possano funzionare con SQL di conseguenza. Quindi segui i passaggi successivi per assicurarti che i programmi Rexx possano funzionare con i database MySQL.
Step 1 - Vai alla seguente pagina di download dei driver dal sito Rexx - https://sourceforge.net/projects/rexxsql/files/rexxsql/2.6/
Step 2 - Scarica i driver MYSQL - rxsql26B3_my_w32_ooRexx
Step 3 - Decomprimere il contenuto sulla macchina locale.
Step 4 - Aggiungi il percorso della cartella decompressa alla variabile del percorso sulla tua macchina.
Per tutti gli esempi successivi, assicurati che siano presenti i seguenti puntatori:
Hai creato un database TESTDB.
Hai creato una tabella EMPLOYEE in TESTDB.
Questa tabella ha i campi FIRST_NAME, LAST_NAME, AGE, SEX e INCOME.
L'ID utente "testuser" e la password "test123" sono impostati per accedere a TESTDB.
Assicurati di aver scaricato il file jar mysql e di averlo aggiunto al tuo classpath.
Hai seguito il tutorial di MySQL
Connessione al database
Per stabilire una connessione al database, è prima necessario utilizzare la DLL Rexxsql e quindi utilizzare la funzione SQLConnect per stabilire una connessione al database. La sintassi e l'esempio di come questo può essere ottenuto sono forniti di seguito.
Sintassi
SQLConnect(cname,username,password,dbname)
Parametri
cname - Questo è il nome da dare alla connessione.
username - Il nome utente per connettersi al database.
password - La password per connettersi al database.
dbname - Lo schema del database a cui connettersi.
Valore di ritorno
Un valore uguale a 0 significa che la connessione al database ha esito positivo.
Esempio
/* Main program */
Call RxFuncAdd 'SQLLoadFuncs', 'rexxsql', 'SQLLoadFuncs'
Call SQLLoadFuncs
say SQLConnect(c1,' testuser ',' test123','testdb')
L'output del programma di cui sopra sarebbe come mostrato di seguito.
0
Creazione di una tabella di database
Il passaggio successivo dopo la connessione al database è creare le tabelle nel nostro database. L'esempio seguente mostra come creare una tabella nel database utilizzando Rexx. Tutti i comandi in Rexx SQL vengono eseguiti utilizzando la funzione SQLCommand.
Sintassi
SQLConnect(sname,statement)
Parametri
sname - Questo è il nome da dare all'istruzione da eseguire.
statement - Questa è l'istruzione che deve essere eseguita sul database.
Valore di ritorno
Un valore uguale a 0 significa che il comando ha avuto successo.
Esempio
/* 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'
L'output del programma di cui sopra sarebbe come mostrato di seguito.
Connect Succedded
Changed database to testdb
Employee table created
Operazioni su una tabella di database
I seguenti tipi di operazioni vengono più comunemente eseguiti su una tabella di database.
Sr.No. | Funzionamento e descrizione |
---|---|
1 | Inserisci operazione È necessario quando si desidera creare i record in una tabella di database. |
2 | Leggi operazione Un'operazione READ su qualsiasi database significa recuperare alcune informazioni utili dal database. |
3 | Operazione di aggiornamento L'operazione UPDATE su qualsiasi database significa aggiornare uno o più record, che sono già disponibili nel database. |
4 | Elimina operazione L'operazione DELETE è necessaria quando si desidera eliminare alcuni record dal database. |
5 | Chiusura di una connessione Il seguente comando può essere utilizzato per chiudere una connessione al database. |
Transazione in corso
Le transazioni sono un meccanismo che garantisce la coerenza dei dati. Le transazioni hanno le seguenti quattro proprietà:
Atomicity - O una transazione viene completata o non accade nulla.
Consistency - Una transazione deve iniziare in uno stato coerente e lasciare il sistema in uno stato coerente.
Isolation - I risultati intermedi di una transazione non sono visibili al di fuori della transazione corrente.
Durability - Una volta che una transazione è stata confermata, gli effetti sono persistenti, anche dopo un errore di sistema.
Ecco un semplice esempio di come implementare le transazioni.
Esempio
/* 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
L'output del programma di cui sopra sarebbe come mostrato di seguito.
Connect Succedded
Changed database to testdb
COMMITTED
Commit Operation
L'operazione di commit è ciò che dice al database di procedere con l'operazione e finalizzare tutte le modifiche al database. Nel nostro esempio sopra, ciò si ottiene con il seguente comando.
Sqlcommit()
Operazione di rollback
Se non sei soddisfatto di una o più modifiche e desideri ripristinarle completamente, utilizza il metodo di rollback. Nel nostro esempio sopra, ciò si ottiene con il seguente comando.
SqlRollback()
I dispositivi portatili hanno fatto molta strada e Rexx ha molti modi in cui può funzionare su questi dispositivi. Rexx supporta Pocket PC, dispositivi Palm, PDA e altri dispositivi smart phone. Il vantaggio di Rexx di lavorare su queste piattaforme è che Rexx è davvero un piccolo sistema di programmazione di peso che funziona solo nell'arco di pochi kilobyte. Quindi diventa più facile eseguire i programmi Rexx su questi dispositivi.
Rexx sui dispositivi palmari può essere eseguito nelle seguenti modalità:
La prima modalità è il nodo nativo in cui viene eseguito direttamente sul sistema operativo stesso. Il vantaggio dell'esecuzione in questa modalità è che è più veloce poiché viene eseguito direttamente dal sistema operativo.
La modalità successiva è in cima al programma DOS o emulatore sopra il dispositivo portatile. Il vantaggio di questa modalità è che può essere eseguito su qualsiasi tipo di sistema operativo purché l'emulatore funzioni su quel sistema operativo.
Di seguito sono riportati gli interpreti Rexx per le varie categorie di dispositivi portatili.
- Windows CE - Brexx
- Palm OS - Rexx per Palm OS
- Symbian OS - Regina
Per l'emulatore DOS, è necessario eseguire i seguenti passaggi:
Step 1- Il primo è scaricare PocketDOS, un popolare emulatore DOS. È progettato per funzionare su molti sistemi operativi e supporta schermi VGA comuni e porte seriali e parallele.
Step 2 - Il passaggio successivo consiste nel scaricare i file BRexx per DOS a 16 bit su un PC Windows.
Step 3 - Il passaggio finale consiste nell'usare ActiveSync per sincronizzare il programma Rexx con il dispositivo portatile.
Sono disponibili altri prodotti commerciali basati su DOS. XTM è un prodotto che rientra in questa categoria. Le caratteristiche di questo prodotto sono le seguenti:
Supporto per la CPU 80186 e set di istruzioni.
In un certo senso funziona fuori dal codice BIOS per prestazioni migliori.
Può fornire l'emulazione per il coprocessore Math, versione 8087 MPU
Fornisce accesso alle porte seriali.
Supporta una varietà di lingue come inglese, francese e tedesco.
Uno degli aspetti chiave di qualsiasi linguaggio di programmazione sono le prestazioni dell'applicazione. È necessario prestare attenzione a pratiche speciali per garantire che le prestazioni dell'applicazione non siano ostacolate. Diamo un'occhiata ad alcune delle considerazioni descritte nei passaggi per una migliore comprensione:
Step 1- Prova a ridurre il numero di istruzioni - In Rexx ogni istruzione comporta un overhead. Quindi prova a ridurre il numero di istruzioni nel tuo programma. Di seguito è riportato un esempio di istruzioni che possono essere ridisegnate.
Invece di utilizzare più istruzioni if else, è possibile utilizzare l'istruzione parse. Quindi, come nel seguente programma, invece di avere una condizione if per ogni valore e ottenere il valore di word1, word2, word3 e word4, usa l'istruzione parse.
/* Main program */
parse value 'This is a Tutorial' with word1 word2 word3 word4
say "'"word1"'"
say "'"word2"'"
say "'"word3"'"
say "'"word4"'"
Step 2- Prova a combinare più affermazioni in una sola. Di seguito è mostrato un esempio.
Supponi di avere il seguente codice che ha eseguito l'assegnazione per: a and b e lo ha passato a un metodo chiamato proc.
do i = 1 to 100
a = 0
b = 1
call proc a,b
end
È possibile sostituire facilmente il codice indicato sopra con il codice seguente utilizzando l'istruzione parse.
do i = 1 for 100
parse value 0 1 with
a,
b,
call proc a,b
end
Step 3 - Prova a sostituire il file do..to loop con il do..for loopove possibile. Questo è normalmente consigliato quando la variabile di controllo viene ripetuta attraverso un ciclo.
/* Main program */
do i = 1 to 10
say i
end
Il programma di cui sopra dovrebbe essere sostituito dal seguente programma.
/* Main program */
do i = 1 for 10
say i
end
Step 4- Se possibile, rimuovere la condizione for da un ciclo do come mostrato nel programma seguente. Se la variabile di controllo non è richiesta, inserire semplicemente il valore finale nel ciclo do come mostrato di seguito.
/* Main program */
do 10
say hello
end
Step 5 - In a select clause, qualunque cosa tu ritenga sia la condizione migliore che verrà valutata deve essere inserita per prima nel file when clause. Quindi nel seguente esempio, se sappiamo che 1 è l'opzione più frequente, mettiamo ilwhen 1 clause come prima clausola nell'istruzione select.
/* Main program */
select
when 1 then say'1'
when 2 then say'2'
otherwise say '3'
end
Ogni programmatore desidera che il proprio programma sia il migliore in termini di qualità ed efficienza. Di seguito sono riportate alcune delle migliori pratiche di programmazione o suggerimenti quando si scrivono programmi Rexx che possono aiutare a raggiungere questi obiettivi.
Suggerimento 1
Utilizzare il comando address prima di inviare qualsiasi comando al sistema operativo o al prompt dei comandi. Ciò ti aiuterà a ottenere lo spazio degli indirizzi in anticipo in memoria e farà sì che il tuo programma funzioni in modo più efficiente.
Di seguito è riportato un esempio del comando address.
Esempio
/* Main program */
address system dir
L'output del comando è il seguente, ma potrebbe variare da sistema a 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
Suggerimento 2
Assicurati che tutti i comandi per il sistema operativo siano in maiuscolo e tra virgolette, ove possibile.
Un esempio per lo stesso è mostrato di seguito.
Esempio
/* Main program */
options arexx_bifs
say chdir('\REXXML100')
say directory()
Quando eseguiamo il programma sopra, otterremo il seguente risultato.
0
D:\rexxxml100
Suggerimento 3
Evita di creare grandi blocchi di commenti come mostrato nel seguente programma.
Esempio
/******/
/* */
/* */
/* */
/******/
/* Main program */
address system dir
Suggerimento 4
Utilizzare l'istruzione Parse per assegnare valori predefiniti. Un esempio per lo stesso è mostrato di seguito.
Esempio
parse value 0 1 with
a,
b
Suggerimento 5
Utilizzare l'istruzione "Left (var1,2)" ove possibile invece dell'istruzione "substr (var1,1,2)".
Suggerimento 6
Utilizzare l'istruzione "Right (var1,2)" ove possibile invece dell'istruzione "substr (var1, length (var1), 2)".
Per poter utilizzare le interfacce utente grafiche disponibili in Rexx, è necessario utilizzare 2 pacchetti, uno viene chiamato ActiveTcl e l'altro è il Rexxtkpacchetto. Insieme a questi 2 pacchetti, è possibile progettare moduli normali che possono avere pulsanti e altri controlli sui moduli.
Configurazione dell'ambiente
La prima cosa da fare è la configurazione dell'ambiente. Esaminiamo i seguenti passaggi per avere l'ambiente a posto.
Step 1 - Scarica il pacchetto Activetcl dal seguente sito Web - https://www.activestate.com/activetcl
Step 2- Il passo successivo è avviare l'installazione di ActiveTCl. Fare clic sul pulsante Avanti sullo schermo per procedere.
Step 3 - Accetta il contratto di licenza e fai clic sul pulsante Avanti.
Step 4 - Scegli una posizione per l'installazione e fai clic sul pulsante Avanti.
Step 5 - Scegli una posizione per l'installazione della demo e fai clic sul pulsante Avanti.
Step 6 - Fare clic sul pulsante Avanti per procedere con l'installazione.
Step 7 - Fare clic sul pulsante Fine per completare l'installazione.
Step 8 - Il passo successivo è scaricare il software Rexxtk dal seguente link - https://sourceforge.net/projects/rexxtk/
Step 9- Fare doppio clic sul file di installazione dal collegamento nel passaggio precedente per avviare l'installazione. Fare clic sul pulsante Avanti per procedere.
Step 10 - Nella schermata successiva, fare clic sul pulsante Sì per accettare il contratto di licenza.
Step 11 - Nella schermata successiva, scegli la posizione per l'installazione e fai clic sul pulsante Avanti.
Step 12 - Scegli la posizione della cartella del programma e fai clic sul pulsante Avanti.
Una volta completata l'installazione, possiamo ora iniziare con la programmazione delle GUI in Rexx.
Programma base
Vediamo come possiamo progettare un semplice programma di base con Rexx in un formato di interfaccia utente grafica.
Esempio
/* Main program */
call RxFuncAdd 'TkLoadFuncs','rexxtk','TkLoadFuncs'
call TkLoadFuncs
do forever
interpret 'Call' TkWait()
end
call TkDropFuncs
exit 0
Le seguenti cose devono essere annotate sul programma di cui sopra:
La libreria Rexxtk e tutte le sue funzioni vengono caricate utilizzando il comando RxFuncAdd.
Il ciclo do forever manterrà la finestra aperta e attenderà l'input dell'utente.
Una volta rilevato l'input dell'utente, il programma verrà chiuso.
Quando il programma di cui sopra viene eseguito, otterrai il seguente output.
Creazione di menu
I menu vengono creati con l'aiuto delle funzioni TkMenu e TkAdd. La sintassi di queste funzioni è fornita di seguito.
Sintassi
TkMenu(widgetname,options,0)
Parametri
Widgetname - Un nome da dare al menu.
Le opzioni possono essere una delle seguenti:
selectcolor - Se le caselle di controllo oi pulsanti di opzione vengono utilizzati come opzioni di menu, questa opzione specifica il colore da scegliere quando viene selezionata un'opzione di menu.
tearoff - Questa opzione viene utilizzata per aggiungere sottomenu al menu principale.
title - La stringa che deve essere utilizzata per dare un titolo alla finestra.
Valore di ritorno
Una maniglia per il menu creato.
Esempio
/* 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
Le seguenti cose devono essere annotate sul programma di cui sopra:
La barra dei menu viene creata utilizzando la funzione TkMenu. Il parametro "strappo" significa che dobbiamo creare sottomenu che verranno allegati al menu principale.
Aggiungiamo quindi 2 opzioni di menu chiamate File e Apri utilizzando la funzione TkAdd.
Quando il programma di cui sopra viene eseguito, otterrai il seguente output.
Reginald è un altro interprete Rexx che è stato sviluppato da Jeff Glantt e ha alcune personalizzazioni su come eseguire i programmi Rexx. In questa sezione, vedremo come ottenere l'installazione di Reginald ed eseguire alcuni programmi Rexx al suo interno.
Configurazione dell'ambiente
Il primo passo è la configurazione dell'ambiente che consiste nel scaricare i file Reginald. Questo può essere fatto dal seguente collegamento al sito Web:http://www.manmrk.net/tutorials/rexx/Reginald/win32/rxusrw32.htm
Una volta completato il download e avviato il programma di installazione, la schermata successiva ti consentirà di scegliere il percorso di installazione.
Fare clic sul pulsante Installa per procedere.
Una volta completato, ora possiamo iniziare a eseguire un programma di esempio nell'interprete Reginald. Crea un semplice programma come mostrato di seguito.
/* Main program */
say 'Hello'
Quindi esegui il seguente comando:
RxLaunch.exe main.rexx
Otterrai quindi il seguente output. Questo programma verrà ora eseguito nell'interprete Reginald.
Altre funzioni disponibili
Oltre ai normali comandi Rexx, Reginald aveva alcuni comandi specifici fatti su misura per il sistema operativo Windows. DriveMap è uno di questi comandi:
DriveMap
Questa funzione fornisce informazioni sull'azionamento.
Syntax -
Drivemap(,options)
Parameters -
Options - Si tratta di un elenco di parole chiave che possono essere utilizzate per ottenere varie informazioni sulle unità del computer locale.
Return Value
Un valore stringa che contiene informazioni sull'unità.
Example -
/* Main program */
say 'Drives on system : ' DriveMap(,'FIXED')
Se viene eseguito il programma sopra, otterrai il seguente output. Questo output dipende da sistema a sistema.
List of disk drives : C:\ D:\
Rexx ha la possibilità di lavorare anche con i server web. Il più comune è il server web Apache. Per poter utilizzare Rexxw con il server web Apache, è necessario prima scaricare i moduli Rexx dal seguente link -https://sourceforge.net/projects/modrexx/?source=typ_redirect
Una volta fatto, assicurati di aggiungere i moduli Rexx mod al percorso di classe.
Le seguenti righe devono essere aggiunte e modificate al file di configurazione di Apache.
Le seguenti righe devono essere aggiunte alla fine dell'appropriato:
- httpd.conf Elenco LoadModule.
- LoadModule rexx_module modules / mod_rexx.dll
Le seguenti righe dovrebbero essere aggiunte alla fine del file http.conf file.
AddType application / x-httpd-rexx-script .rex .rexx
AddType application / x-httpd-rexx-rsp .rsp
Aggiungili per il supporto della pagina server REXX
RexxRspCompiler "c: / Program Files / Apache Group / Apache2 / bin / rspcomp.rex"
Una volta apportate le modifiche di cui sopra, è necessario arrestare e riavviare il server Web Apache.
Le righe precedenti consentono anche di avere pagine del server basate su Rexx proprio come le pagine del server Java. Puoi aggiungere il codice Rexx direttamente alle pagine html.
Di seguito è mostrato un esempio:
<p>The current date and time is
<?rexx
/* Inserting the rexx statement */
say date() time()
?>
</p>
Quando viene eseguita una pagina del server basata su Rexx, vengono eseguite le seguenti operazioni:
Prima viene creato un file temporaneo.
Quindi il compilatore Rexx Server compila il file in un programma Rexx e lo inserisce nel file temporaneo.
Il passo successivo è eseguire effettivamente il programma Rexx.
Infine, il file temporaneo viene rimosso.