Guida A Rebol

Attach:rebol.png Δ

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 italiano

Visita questo gruppo

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:

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!

Email

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:

  1. Salvare il contenuto della pagina http://www.rebol.com in un file chiamato rebol.html
  2. Scrivere un programma che chieda all'utente di fornire 3 numeri e far indicare al programma quale sia il piu' alto.
  3. Fare un programma che chieda all'utente continuamente un numero, e stampi la media di tutti i numeri inseriti fino a quel momento.
  4. Come l'esercizio precedente ma per un gruppo di numeri arbitrari, deciso volta per volta dall'utente (per 5 numeri, per 3, per 12...)
  5. Calcolare il numero di giorni dal proprio compleanno.
  6. 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"]

Attach:textlist.jpg Δ

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"
	]]]

Attach:xy.jpg Δ

Arc (ellissi)

Il comando 'ARC serve per fare archi, ellissi e circonferenze. Sinossi:

!Argomento!Tipo!Descrizione
CentroCoppiaCentro della ellissi
RaggioCoppiaRaggio dei due assi delle ellissi
Angolo d'iniziodecimaleAngolo d'inizio dell'arco (opzionale)
Angolo finaledecimaleAngolo finale dell'arco (opzionale)
Chiusoparolaclosed 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 finecoppiaUna 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
   ]
  ] 
 ]