Lisp – per chi è L(λ)THW e sintassi del linguaggio

large_get_sbcl_mugIl capitolo Preface pt. iii – Who Is This Book For? è da leggere attentamente, sono pienamente d’accordo con –beh– tutto.
Io mi considero (moderatamente) un You are already a Lisper, but want to take your code to the next level ma va bene per tutte le altre categorie. Anzi: You don’t have to know anything about programming or computer science to learn Lisp with this book. Però: I’m going to assume that you know that learning any new skill is hard for everyone, and that you need to work hard in order to succeed. Insomma The Phoeron rockz!
Mi sta venendo un dubbio: se continuo a citare (copiancollando) faccio la cosa giusta? Credo di no, leggetevelo voi. Dai!
Anche se, continuando con l’introduzione, non mi trovo tanto d’accordo con il misticismo del Lisp; almeno per ora. Forse quando sarò un grok fatto e finito… (non sapete cos’è il grokking? è il padroneggiare la materia –facciamo che vi leggete la definizione da Urban Dictionary). No, direttamente da Heinlein, nel capitolo successsivo.

OK, credo sia il momento di una panoramica della sintassi. In Lisp tutto è un oggetto e gli oggetti sono rappresentati da S-Expressions.
Le S-Expressions vengono dal Lambda Calculus, ognuna delle quali può essere un Atom o una List. Le liste sono implementate come Cons-Cells e gli atomi sono tutti gli oggetti che non sono un cons (le Cons-Cells prossimamente).
Viene proposto un primo esercizio, ecco il mio compito. Notare che sono stato mooolto coscienzioso: ho riprodotto l’errore di stumpa per lambda 🙄

ll1

Questi sono diversi tipi di atomi. Come si vede gli atomi possono essere parecchie cose: numeri, simboli, caratteri letterali (?), stringhe e liste vuote. Come si vede nil, '() e () restituiscono la stessa cosa: NIL. Questo perché nil è definito come la lista vuota che viene trattato come atomo visto che non richiede consing.
Le stringhe, trattate come atomi sono in realtà sequenze di caratteri; anche le liste sono sequenze. Per capire cosa succede bisogna considerare la gerarchia degli oggetti. In Lisp ogni oggetto discende da t ad eccezione della lista vuota e la sua rappresentazione nil.
Pertanto t e ogni oggetto che da esso discende rappresenta vero (true) mentre nil falso.

Qualcuno degli esempi sopra è quotato: ha un apice davanti. Questo è una scorciatoia di quote dice a Lisp di non valutare l’oggetto quotato. Esempi di espressioni quotate:

ll2

Le liste sono racchiuse tra parentesi. Ogni oggetto annidato entro una lista è un’S-Expression. Tutto quello non quotato è automaticamente valutato. Queste liste si chiamano form, esempio:

ll3

Cose da notare:

  • una form inizia con una funzione, macro o operatore speciale, tipicamente rappresentato da un simbolo;
  • il resto della form sono i parametri passati alla funzione, macro o operatore speciale;
  • si possono avere altre form come parametri, quelle interne vengono valutate per prime e il loro risultato viene usato come parametro al livello successivo della gerarchia.

Questa sintassi è nota come notazione polacca prefissa. Nel primo esempio è chiaro quello che capita: (+ 10 20 (* 30 2)) diventa dapprima (+ 10 20 60) e poi 90. In casi semplici come questo non se ne vede (purtroppo) la grande semplificazione che porta.
Di solito l’espressione nella posizione di operatore (la prima) di una form è un simbolo che rappresenta una funzione. Può però essere anche una funzione anonima, una macro o una special form. Le special form hanno regole loro, c’è un metodo per definirle. Le marco consentono, tra le altre cose, di creare sintassi personalizzate consentendo l’estensione del linguaggio. Ci sono anche le reader macros che consentono di definire form per trattare nuovi tipi di dati.
Abbiamo già usato una macro: l’apice usato al posto di quote.

Con questa sintassi (è tutta qui) si può esprimere qualunque programma immaginabile, usando il paradigma di programmazione che volete (imperativa, procedurale, object-oriented, or funzionale).

Prossimamente… forse… 🙄

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: