
Continuo da qua: Clojure, concetti fondamentali I nell’esame dei componenti fondamentali del linguaggio.
Numeri
Clojure prevede millemila tipi di numeri, questi:
esempio |
tipo numerico |
42, 0xff, 2r111, 040 |
long (64-bit segnato) |
3.14, 6.0221415e23 |
double (64-bit IEEE floating point decimal |
42N |
clojure.lang.BigInt (intero, precisione arbitaria) |
0.01M |
java.math.BigDecimal (floating point
segnato con precisione arbitraria) |
22/7 |
clojure.lang.Ratio |
Ogni numero può essere negativo, con il – iniziale.
I numeri in notazione esadecimale sono come nel C: 0xff vale 255 e 0xd055 è 53333.
Idem per gli ottali 040 vale 32 decimale.
Ci sono anche i numeri (interi) a base flessibile, nella forma BrN dove B è la base, compresa tra 2 e 36. Per esempio 2r111 è 7 e 16rff 255.
I ratios, numeri razionali sono sempre rappresentati da due interi separati da /.
Espressioni regolari
Clojure tratta le stringhe con prefisso #
come espressioni regolari:

che è quasi come /.../
di Ruby:

nota: irq=’irb –simple-prompt’
A differenza di Java non si deve escapare il backslash

in Java si sarebbe dovuto scrivere “(\\d+)-(\\d+)
“.
Commenti
Ci sono due tipi di commento:
;
quello usuale del Lisp, dal punto-virgola fino alla fine della riga;
#_
a livello di forma, utile per il debug, eccone un esempio:

C’è poi la macro comment
:

può fallire:

perché torna nil
, usare #_
in questi casi.
Spazi (whitespaces) e virgole
Di solito le virgole, usuali negli altri linguaggi di programmazione, non ci sono:
(defn somma-ingenua
[x y]
(+ x y))
Questo perché lo spazio (o tab o a-capo) è sufficiente a separare le variabili. Ma se uno vuole può mettere anche le virgole (fin dalle origini del Lisp, poi qualcuno non le accetta ma è un altro discorso).
(defn somma-ingenua
[x, y]
(+ x, y))
E vale anche questo:

Ci sono dei casi in cui le virgole tornano utili per migliorare la leggibilità, come nelle mappe:
(create-user {:name new-username, :email email})
Collezioni
Esempi delle strutture di dati più comuni:
'(a b :name 12.5) ;; lista
['a 'b :name 12.5] ;; vettore
{:name "Chas" :age 31} ;; mappa
#{1 2 3} ;; insieme (set)
Notare che la lista dev’essere quotata (con l’apice '
) perché altrimenti viene eseguita.
Scorciatoie per espressioni
Ce ne sono parecchie, difficili da memorizzare per me:
una funzione anonima può essere definita con #()
;
le var possono essere riferite con #'
(vedi esempio sotto)
l’istanza a una referenza può essere dereferenziata con @
(vedi esempio sotto)
per le macro ci sono `
syntax-quote, ~
unquote e ~@
unquote splicing (prossimamente…).
ogni struttura può avere metadata, piccole quantità di informazione, come per indicare il tipo di valore ritornato da una funzione o se è privata per un certo namespace, si usa ^
A proposito di #'

e di @

OK, si capisce poco, prossimamente…
No, non è finita, da continuare, ancora 😉