Guida A Rebol
REBOL per utonti
Guida iniziata il 12/11/2008
Rebol e' un linguaggio di programmazione meraviglioso, e' semplice, potente e potete creare applicazioni con interfaccia grafica con pochissime righe di programmazione!. Grazie a Rebol potrete fare anche grafica 2D, grafica 3D, tutto con il minimo sforzo. Se volete scrivermi: maxint@tiscali.it
Se volete piu' informazioni esiste:
Rebol significa RIVOLUZIONE.
Ecco una demo:
⚠ (:youtube -RVhBImcEAE:)
Utilizzatori nel mondo:
Vantaggi
I vantaggi sono molteplici:
- Linguaggio di altissimo livello: cioe' piu' vicino al modo di pensare delle persone che dei computer, piu' facile da correggere e da scrivere.
- GRATIS: potete scaricare Rebol (meno di 1 MB) dal sito http://www.rebol.com per far girare tutti i programmi
- Multipiattaforma: funziona su Windows, Linux, OSX, BSD e altre 42 piattaforme senza alcuna modifica
- Compatto: con poche righe di codice potete fare cose che in un qualsiasi altro linguaggio servirebbero centinaia di righe
- Interpretato: non dovete compilare il programma o modificare qualcosa, una volta scritto è pronto, quindi di ogni programma e' possibile vedere il sorgente.
Indice Guida
Prova
Scaricate rebview e avviatelo, avrete a disposizione programmi, demo, e altre cose per capire se Rebol fa per voi.
LA VERSIONE DI REBOL DA SCARICARE E' LA 2.7.X, LA VERSIONE 3 E' ANCORA IN FASE DI TESTING E NON FUNZIONA CON GLI ESEMPI RIPORTATI
Installazione
Windows
- Scaricate rebview.exe
- Avviatelo
- Lanciate la console (icona sulla sinistra)
- digitate install e premete invio
Linux
- Installate rebview in /usr/bin/
- per avviare un programma basta lanciare rebview nomeprogramma.r
- oppure aggiungere alla prima riga del programma con #!/usr/bin/rebview
Programmi per scrivere i programmi (editor)
Per scrivere un programma basta un qualunque editor di testo come il blocco note di Windows o kate, gedit su linux. I migliori comunque sono:
- SciTE: http://www.scintilla.org/SciTE.html (Linux, Windows)
- Crimson editor: http://www.crimsoneditor.com/ (Windows)
Tipi di dati
Rebol ha tutta una serie di tipi di dati gia' pronti per essere utilizzati e manipolati correttamente. Il vantaggio e' che automaticamente operera' correttamente su di loro (somma, sottrazione, ecc.). L'elemnto piu' impressionante e' che REBOL capisce da solo che tipo di dato sia! La funzione //type?// ci dice di che tipo sia il dato.
Denaro
Rebol ha un tipo di dato per i soldi, basta anteporre il simbolo del dollaro davanti ad una cifra decimale, esempio:
$0.40
altro esempio:
>> type? $9.89 == money!
Ma c'e' di piu', potete anche usare diverse valute usando le 3 lettere internazionali di identificazione davanti al dollaro: EUR$, CHF$
>> type? EUR$84.87 == money!
Interi
Sono numeri interi:
>> type? 8 == integer!
Decimali
Sono numeri decimali, hanno il punto per dividere le unita' dai decimali:
>> type? 14.8 == decimal!
Stringhe
Sono variabili che contengono parole o frasi, hanno le virgolette prima e dopo:
>> type? "Ciao a tutti" == string!
Tempo
Per memorizzare l'ora, si usano i due punti (ore, minuti, secondi):
>> type? 15:32:01 == time!
Coppie
Per memorizzare coppie di numeri, come la risoluzione di un monitor:
>> type? 640x480 == pair!
se si vuole prendere solo un valore della coppia e' semplicissimo, basta indicale /1 o /x per il primo valore; oppure /2 o /y per il secondo.
>> a: 640x480 == 640x480 >> a/1 == 640
Caratteri
Per memorizzare singole lettere, per fare cio' anteponete il cancelletto e mettete il carattere tra virgolette:
>> type? #"D" == char!
Bytes
Potete scrivere direttamente in codice macchina! Potete scrivere sia in esadecimale che in 64 bit,esempi:
>> type? #{42652061205245424F4C} == binary! >> type? 64#{UkVCT0wgUm9ja3Mh} == binary!
Esiste anche il formato email:
>> type? maxint@tiscali.it == email!
Identificativi
Codici di idcentificazione, basta anteporre il cancelletto:
>> type? #0000-1234-56EV-989 == issue!
Tag
I tag usati in vari linguaggi, utili nella programmazioni di applicazioni per il web:
>> type? <img src="cover.png"> == tag!
Percorsi file
I percorsi dei file si inseriscono anteponendo il simbolo %:
>> type? %/c/rebol/rebol.exe == file!
URL
Gli indirizzi web:
>> type? http://maxint.dynalias.org == url!
Blocco
Il blocco è una peculiarita' di Rebol molto importante, si tratta di un elenco che permette di essere elencato di idnca con parle racchiuse da parentesi quadre:
>> type? [mano piede naso] == block!
Altri
Rebol interpreta tutto, ecco una lista di tutti i tipi che si ottiene digitando:
help datatype! action! datatype! action! any-block! datatype! any-block! any-function! datatype! any-function! any-string! datatype! any-string! any-type! datatype! any-type! any-word! datatype! any-word! binary! datatype! binary! bitset! datatype! bitset! block! datatype! block! char! datatype! char! datatype! datatype! datatype! date! datatype! date! decimal! datatype! decimal! email! datatype! email! error! datatype! error! event! datatype! event! file! datatype! file! function! datatype! function! get-word! datatype! get-word! hash! datatype! hash! image! datatype! image! integer! datatype! integer! issue! datatype! issue! library! datatype! library! list! datatype! list! lit-path! datatype! lit-path! lit-word! datatype! lit-word! logic! datatype! logic! money! datatype! money! native! datatype! native! none! datatype! none! number! datatype! number! object! datatype! object! op! datatype! op! pair! datatype! pair! paren! datatype! paren! path! datatype! path! port! datatype! port! refinement! datatype! refinement! routine! datatype! routine! series! datatype! series! set-path! datatype! set-path! set-word! datatype! set-word! string! datatype! string! struct! datatype! struct! symbol! datatype! symbol! tag! datatype! tag! time! datatype! time! tuple! datatype! tuple! unset! datatype! unset! url! datatype! url! word! datatype! word!
Variabili
In Rebol tutto è una variabile, anche le parole riservate possono essere utilizzate come variabili e ridefinite. Per definire una variabile basta che cominci per una lettera e l'assegnamento si fa con i due punti, ecco un esempio:
>> melo: 12 == 12 >> melo: melo + 2 == 14 >> melo: "Apriti sesamo" == "Apriti sesamo"
Per stampare una variabile basta usare il comando print:
>>print melo == "Apriti sesamo"
I blocchi
I blocchi sono una parte importante di Rebol, i blocchi possono contenere altri blocchi. Ecco alcuni esempi:
>> prova: [10 [5x3 $4] "Ciccio" now/date] == [10 [5x3 $4.00] "Ciccio" now/date]
La funzione now/date non è interpretata. Se si usa la funzione reduce viene interpretata:
>> prova: reduce [10 [5x3 $4] "Ciccio" now/date] == [10 [5x3 $4.00] "Ciccio" 26-Nov-2008]
ATTENZIONE Se il blocco contiene altri blocchi, i blocchi interni non sono valutati.
Inserire dati nei blocchi
Vi sono molti modi per inserire dei dati nei blocchi:
APPEND
append inserisce i dati alla fine del blocco:
a: ["Buon"] append a "anno!" >> ["Buon" "anno!"]
Scelte e cicli
IF
Per fare una determinata azione se una espressione è vera, ecco alcuni esempi:
>> a: 1 >> if a = 0 [ "zero" ] >> if a = 1 [ "uno" ] == "uno"
While
La funzione while serve a utilizzare più condizioni per decidere se fare un'azione e/o la durata:
>>a: 0 >>b: 0 >> while [ a = 0 b < 10 ] [ print b b: b + 1] 0 1 2 3 4 5 6 7 8 9 == 10
loop
Ripete un ciclo un numero di volte:
>>loop 5 [print "Ciao"] Ciao Ciao Ciao Ciao Ciao
Forever
Il comando forever ripete un ciclo finche' non si da' il comando break:
>>a: 0 >>forever [ a: a + 1 print a if a = 10 [ break] ] 1 2 3 4 5 6 7 8 9 10
Switch
Il comando switch permette di scegliere fra varie possibilità, oppure un caso che non rientra in nessuno di essi; dopo il comando si mette la variabile e poi il blocco dei vari casi della variabile e per ultimo il caso di default:
>>a: 3 ==3 switch/default a [ 1 [print "uno"] 3 [print "tre"] ] [print "boh"] ==tre
Matematica
USATE SEMPRE LE PARENTESI TONDE, Rebol non da' precedenze agli operatori:
>>print 5 + 5 * 4 "SBAGLIATO" 40 == "SBAGLIATO" >> print 5 + (5 * 4) "GIUSTO" 25 == "GIUSTO"
Rebol ha tutte le piu' importanti funzioni matematiche:
** POTENZA // RESTO exp e elevato log-10 LOGARITMO BASE 10 log-2 LOGARITMO BASE 2 log-e LOGARITMO BASE e square-root RADICE QUADRATA absolute valore assoluto negate CAMBIA SEGNO min MINIMO FRA 2 VALORI max MASSIMO FRA 2 VALORI sine SENO cosine COSENO tangent TANGENTE arcsine ARCSENO arccosine ARCCOSENO arctangent ARCTANGENTE
Tutte le funzioni
L'elenco delle funzioni pronte in Rebol lo potete trovare a questo indirizzo:
http://www.rebol.com/docs/dictionary.html
Mi limitero' ad illustrare solo le piu' utili.
Input / Output
Ci sono vari modi per prendere dei dati ma sono tutti estremamente semplici.
Read
Con la funzione read leggiamo direttamente cio' che ci serve (file, pagine web, ecc.):
>> read http://www.google.it == {<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style>body,td,a,p,.h{... >> a: read http://www.google.it == {<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style>body,td,a,p,.h{...
Ask
Con la funzione ask chiediamo via terminale qualcosa ad un utente:
>> pass: ask "Nome in codice?"
Input
input è come ask ma non chiede, aspetta l'utente che digiti qualcosa e basta.
Write
write scrive in un file i dati:
>> write %./prova.txt "Ciao"
ESERCIZI
Ecco degli esercizi per capire se si è appreso i concetti fino a qui esposti:
- Salvare il contenuto della pagina http://www.rebol.com in un file chiamato rebol.html
- Scrivere un programma che chieda all'utente di fornire 3 numeri e far indicare al programma quale sia il piu' alto.
- Fare un programma che chieda all'utente continuamente un numero, e stampi la media di tutti i numeri inseriti fino a quel momento.
- Come l'esercizio precedente ma per un gruppo di numeri arbitrari, deciso volta per volta dall'utente (per 5 numeri, per 3, per 12...)
- Calcolare il numero di giorni dal proprio compleanno.
- Modifica in ROT-13 di un testo, in entrambi i sensi.
Interfacce (VID)
In Rebol fare programmi con interfacce grafiche è semplicissimo e permette di ottenere risultati strabilianti in breve tempo. In Rebol tutti gli elementi grafici sono contenuti in facce; ogni faccia si può immaginare come un rettangolo con tutta una serie di proprietà (colore, bordo, immagine contenuta, font dei caratteri e molto altro ancora...).
Il linguaggio per le interfacce puo' essere molto semplice se si usa un dialetto di Rebol il VID (sempre gia' incluso in Rebol), il VID sono tutta una serie di comandi che permettono di scrivere velocemente delle interfacce. Volendo, pero', e' possibile andare piu' a fondo del linguaggio delle interfacce e non usare il VID.
Esiste anche una piccola guida in inglese su http://www.rebol.com/docs/easy-vid.html
Primo esempio
view layout [ across label italic font [ color: brick ] "To:" tab inp-to: field return label italic font [ color: brick ] "Subject:" tab inp-subj: field return inp-text: area return button "Send" [ foreach addr parse inp-to/text ",;" [ send to-email addr rejoin [inp-subj/text newline inp-text/text] ] quit ] ]
Ecco cosa esce fuori:
E' un programma per scrivere email. Esiste un altro linguaggio che permette cosi' tanto con cosi' poco? NO.
Altro esempio:
do http://www.fys.ku.dk/~niclasen/rebol/space/ngc7635.r
Da dove cominciare
Per fare programmi grafici bisogna usare la funzione view layout []. All'interno di questa funzione vanno messe le varie *facce*.
Posizione
Esistono 2 possibili posizionamenti, che possono essere anche alternati, across e below; per ogni nuova riga o colonna usare la parole return. Se non viene scritto nulla si sottointende below:
view layout [ across text "a1" text "a2" text "a3" return text "aA" text "aB" text "aC" below text "b1" text "b2" text "b3" return text "bA" text "bB" text "bC"
Provate a vedere le differenze cambiando l'ordine delle parole.
Testi
Per far apparire del testo dentro una finestra esistono tante possibilità, come l'HTML:
view layout [ title "Titolo" text "normal text" h1 "Titolo 1" h2 "Titolo 2" h3 "Titolo 3" h4 "Titolo 4" h5 "Titolo 5" code "Codice programmi" banner "Banner" vtext "Video text" vh1 "Video Titolo 1" vh2 "Video Titolo 2" vh3 "Video Titolo 3" vh4 "Video Titolo 4" label "etichetta" ]
Se preferiti colori diversi da quelli di default, si possono decidere nella massima libertà.
Altri esempi
Ecco un esempio con un la maggior parte degli oggetti che si possono mettere in una finestra:
view layout [ h1 "Altri esempi:" box red 500x2 text "Ci sono piu' di 40 oggetti da poter utilizzare in Rebol" bar: progress slider 200x16 [bar/data: value show bar] area "Scrivi qui" drop-down "Primo" "Secondo" "Terzo" text-list 60x60 "uno" "due" "tre" across toggle "Click" "Here" rotary "Click" "Again" "And Again" choice "Choose" "Item 1" "Item 2" "Item 3" [alert value] radio radio radio led return arrow arrow left arrow right arrow down return field "oppure qui.." return image logo.gif ]
Attach:altriesempipulsanti2.jpg Δ
Input di testo
Per prendere del testo basta impostare una variabile con il tipo di input preferito field singola riga o area per più righe:
view layout [ campo: field areatesto: area ]
Liste di testo
Un lista di testo e una colonna in cui mettere delle righe da cui scegliere, ecco un esempio:
view layout [ text-list "Acqua" "Fuoco" "Vento" "Terra"]
Come vedete e' molto semplice scrivere delle liste.
Ma se avete da lavorare con molti dati, è meglio usare la parola data, in modo da poter prendere i valori da altre variabili, esempio:
a: [ "Acqua" "Fuoco" "Vento" "Terra"] view layout [ text-list data a ]
Se volete modificare successivamente una lista basta cambiare il valore dell'elemento data di questo oggetto, provate il seguente:
a: [ "Acqua" "Fuoco" "Vento" "Terra"] view layout [ bb: text-list data a button "Clicca!" [ bb/data: [ "Sale" "Pepe" "olio" "origano"] show bb ] ]
Titolo della finestra
Il titolo della finestra e' impostato da Rebol come il titolo dello script, ma potete usare la funzione view/title per impostarlo voi:
Rebol [ Title: "Esempio"] view layout [ text "Il titolo della finestra e' Esempio." ] view/title layout [ text "Il titolo della finestra e' demo." ] "demo"
Aprire una nuova finestra
Per aprire una nuova finestra basta usa view/new
Rebol [ Title: "Esempio"] view layout [ button "info" [ view/new layout [text "Finestra con titolo Esempio"] ] button "info" [ view/new/title layout [text "Finestra con titolo Info"] "Info" ] ]
Chiudere una finestra
Per chiudere una finestra basta usare il comando unview
view layout [ button "info" [ view/new layout [button "Chiudi" [unview]] ] ]
Potete anche chiudere un'altra finestra, basta mettere il nome del layout che volete chiudere dopo il comando unview.
Azioni
Ogni elemento grafico che potete usare ha la possibilità di attivare un'azione, basta mettere un paio di parentesi quadre dopo l'elemento.
view layout [ button "Esempio." [view layout [ text "Ciao"]]]
Modificare gli elementi
E' sempre possibile modificare un elemento grafico anche dopo che e' apparso sullo schermo, basta:
- assegnargli una variabile
- modificare una sua caratteristica
- dire di far vedere la variazione (comando show)
per esempio il testo di un pulsante:
view layout [ a: button "clicca qui" [ a/text: "BRAVO!" show a ] ]
E' possibile attivare piu' oggetti:
view layout [ b: title "Esempio" a: button "clicca qui" [ a/text: "BRAVO!" b/text: "BRAVO!" show [a b] ] ]
Animazioni
Potete creare molto facilmente delle animazioni con il comando anim, basta avere delle immagini da inserire:
view layout [
anim rate 10 frames [ ciccio.jpg %rebologo2.gif] ]
Rebol accetta qualsiasi formato immagine (jpg, png, gif), ma non utilizzate gif animate con questo comando.
Grafica 2D (DRAW)
Per la grafica 2D conviene usare un altro dialetto di Rebol il DRAW; anche in questo caso possiamo andare piu' a fondo del draw, ma già cosi' di solito basta. Un elenco delle funzioni di DRAW lo trovate qui: http://www.rebol.com/docs/draw-ref.html vi consiglio fortemente di andarlo a leggere.
Per mettere un disegno bisogna mettere una box con l'effetto draw dove mettere il disegno, esempio:
view layout [ box effect [ draw [ arc 20x20 20x20 0 360 ] ] ]
Il sistema di riferimento parte da in ALTO A SINISTRA e prosegue verso destra (x) e verso il basso (y), esempio:
view layout [ box 100x100 effect [ draw [ arrow 1x0 line 5x5 90x5 line 5x5 5x90 text 90x5 "X" text 10x80 "Y" ]]]
Arc (ellissi)
Il comando 'ARC serve per fare archi, ellissi e circonferenze. Sinossi:
!Argomento | !Tipo | !Descrizione |
Centro | Coppia | Centro della ellissi |
Raggio | Coppia | Raggio dei due assi delle ellissi |
Angolo d'inizio | decimale | Angolo d'inizio dell'arco (opzionale) |
Angolo finale | decimale | Angolo finale dell'arco (opzionale) |
Chiuso | parola | closed Parola opzionale per disegnare anche i raggi e chiudere gli archi aperti |
Esempio:
view layout [ box effect [ draw [ arc 40x40 40x20 0 150 closed ] ] ]
Arrow (Frecce)
Le frecce si possono mettere a molti tipi di geometrie di DRAW (linee, archi, box, polilinee), sinossi:
!Argomento | !Tipo | !Descrizione |
inizio x fine | coppia | Una qualunque combinazione di 0 (nulla) 1 (punta) 2 (coda) |
Esempio:
view layout [ box 500x500 effect [ draw [ pen yellow arrow 1x2 line 20x20 100x100 pen blue arrow 1x2 curve 50x50 300x50 50x300 300x300 pen green arrow 1x2 spline 3 30x30 200x70 150x200 70x300 80x300 200x200 pen black arrow 1x2 spline closed 3 20x20 250x70 170x200 400x300 80x300 180x200 pen white arrow 1x2 polygon 40x40 200x90 150x220 50x320 pen navy arrow 1x2 box 400x400 330x330 ] ] ]