Clojure, concetti fondamentali IV

960-RichHickey

Valutazione dei simboli

Adesso che conosciamo i namespaces possiamo tornare al precedente esempio di calcolo della media, presentato qui, che è poi questa:

(defn average [numbers]
    (/ (apply + numbers) (count numbers)))

Esaminiamo il corpo di questa funzione: ci sono diversi simboli che si riferiscono o a una var attiva nel namespace corrente o a un valore locale:

  • /, apply, + e count sono funzioni definite nel namespace clojure.core;
  • numbers è sia il solo argomento passato alla funzione che il valore usato nel corpo in (apply + numbers) e (count numbers).

(average [60 80 100 400])

Quando poi si chiama la funzione average con il vettore il simbolo average si riferisce al valore di #'(average) (nota per me che me ne dimentico sempre #'sym è la var per il simbolo sym) nel namespace corrente.

Forme speciali

Non considerando l’interoperabilità con Java i simboli nella function position (i car nelle liste per dirla lispescamente) possono essere di due tipi:

  • il valore di una var relativa a un namespace nominato o locale, come già visto;
  • una special form di Clojure.

Le special form sono i componenti fondamentali (i pezzi del Lego) con i quali il resto di Clojure è costruito. Concetto che risale alle origini del Lisp (a me viene da pensare alle macro). In ogni caso Clojure è costruito sulle special form, bisogna rassegnarsi a conoscerle, una per una.

Soppressione della valutazione: quote

quote sopprime la valutazione dell’espressione, per esempio per i simboli. Con quote allora i simboli rappresentano se stessi, come le stringhe, i numeri, …:

s0

Naturalmente scrivere quote è troppo lungo, fin dalle origini del Lisp c’è il carattere quote ' (apice, apostrofo).

s1

Ogni form può essere quotata, esempio:

s2

Le liste sono valutate come chiamate, quotandole se ne sopprime la valutazione, ottenendo la lista stessa, costituita in questo caso dai simboli '+, 'x e 'x. Che è poi quello che facciamo quando costruiamo la lista:

s3

Quotando una form si vede cosa produce il reader, p.es.:

s4

OK, l’ultima scritta così non è che si capisca molto, meglio in questa forma:

'`(a b ~c)
(clojure.core/seq
    (clojure.core/concat (clojure.core/list (quote user/a))
    (clojure.core/list (quote user/b))
    (clojure.core/list c)))

e se poi elimino il namespace comune diventa:

'`(a b ~c)
(seq (concat
    (list (quote user/a))
    (list (quote user/b))
    (list c)))

Basta! Clojure va preso a piccole dosi; sarà lunga 😉

Posta un commento o usa questo indirizzo per il 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: