Clojure, concetti fondamentali II

Lambda

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:

s1

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

s2

nota: irq=’irb –simple-prompt’

A differenza di Java non si deve escapare il backslash

s3

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:

s4

C’è poi la macro comment:

s5

può fallire:

s6

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:

s7

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 #'

s8

e di @

s9

OK, si capisce poco, prossimamente…

No, non è finita, da continuare, ancora 😉

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: