Common Lisp Macro/2

In questa seconda parte vedremo alcuni utilizzi delle macro in Common Lisp
e discuteremo due problemi tipici: la cattura accidentale di nomi (variable capture) e la valutazione
multipla.

[Read more…]

Common Lisp Macro/1

Tra le funzionalità che rendono il Common Lisp un linguaggio molto
potente e differente
da quelli più diffusi, vi sono
le macro.Una notazione ed una sintassi con poche regole ed un sistema di
lettura, compilazione e esecuzione del codice molto flessibile danno
allo sviluppatore la possibilità di astrarre un pattern di codice in
un nuovo costrutto, laddove tale pattern non può essere astratto con
una tradizionale funzione. I lettori che già conoscono il Common Lisp
possono saltare il prossimo paragrafo, nel quale ne sono riassunte
brevemente le basi. Coloro i quali vogliono approfondire o conoscere le macro in Scheme possono visionare le Avventure di un Pythonista in Schemeland 8, 9,10 e 11.
[Read more…]

Le avventure di un Pythonista in Schemeland /9

Non c’è limite al livello di sofisticazione che si può raggiungere con
le macro; in particolare è possibile definire delle macro di ordine
superiore, ovverossia delle macro che definiscono macro. Questa
tecnica permette uno stile di programmazione molto elegante, che però
può facilmente condurre a codice incomprensibile e indebuggabile.
Per evitare ciò,
sarò costretto ad introdurre dei tool di supporto. Sfortunamente tali tool non saranno standard, in
quanto la tradizione di Scheme è quella
di fornire degli strumenti di base estremamente potenti con cui è
possibile definire delle utilità che rendono la programmazione in
Scheme relativamente semplice e debuggabile, ma di non inserire
tali utilità direttamente nello standard. Questo significa che ogni
programmatore è obbligato a invertarsi dei tool di sviluppo personali
diversi da quelli di tutti gli altri.

Il sistema di macro non fa eccezione a questa filosofia e per esempio
non esistono nello standard strumenti di debugging per le macro tipo
il macroexpand del Common Lisp anche se sono facilissimi da
costruire. La cosa fastidiosa è che non sarebbe stato difficile
rendere gli strumenti di base più usabili. Ci possono essere varie
spiegazioni per questa omissione. Volendo essere cattivi, si potrebbe
pensare che sia stato fatto per obbigare gli studenti a svolgere i
compiti, o addirittura che sia stato fatto per rendere Scheme un
linguaggio per pochi eletti.

[Read more…]

Il linguaggio Scala

Da tempo si sente l’esigenza di superare Java per rendere la
programmazione più flessibile, agile e, se possibile, vicina al
linguaggio naturale. Molti hanno individuato la ragione della rigidità
di Java nella sua tipizzazione statica e si sono pertanto rivolti a
linguaggi dinamici. Tali strumenti di programmazione, però, suscitano
numerosi
dubbi e perplessità
, in chi, come me, proviene dal mondo della
tipizzazione statica.

È per questo che il nuovo linguaggio Scala, tipizzato staticamente e
libero dai tanti problemi di Java, non manca di affascinarmi.
Realizzato a partire dal 2001 dal Politecnico di Losanna sotto la
guida di Martin
Odersky
, uno degli sviluppatori del compilatore Java, è stato
rilasciato pubblicamente per la prima volta nel 2004 in due versioni,
una per la piattaforma Java ed un’altra per .NET, ed ha subito un
sostanziale miglioramento nel corso del 2006. Vediamone alcune delle
caratteristiche principali.

[Read more…]

Le avventure di un Pythonista in Schemeland /5

Il sottotitolo di questa puntata potrebbe essere “I pericoli del
benchmark”. I benchmark sono utili negli articoli, in quanto
suscitano discussioni e accesi dibattiti e costituiscono
un trucco strategico per attirarsi lettori.
D’altra parte, il pericolo maggiore dei benchmark è quello di
crederci: parafrasando Mark Twain there are lies, damned lies, and
benchmarks
. Questo vuol dire non soltanto che i benchmark lasciano il
tempo che trovano perché la realtà è diversa dal benchmark, ma anche
che è facilissimo sbagliare un benchmark o non interpretarlo
correttamente. In questa puntata mostrerò alcuni dei pericoli
inerenti al benchmark del fattoriale mostrato nella puntata precedente,
che pure potrebbe sembrare banale ed inoppugnabile. Se un benchmark
così semplice è così delicato, vi lascio immaginare che succede per
benchmark più complessi. L’unico vantaggio dei benchmark è che spesso e
volentieri fanno capire quanto siano sbagliati i pregiudizi che
abbiamo sull’efficienza di una certa soluzione rispetto all’efficienza
di un’altra soluzione.

[Read more…]

Le avventure di un Pythonista in Schemeland/4

Nelle puntate precedenti non ho fatto altro che parlare male di
Scheme. In questa puntata cercherò di riequilibrare la situazione,
parlando di performance e dei vantaggi di un compilatore
ottimizzante. Sarà però necessario superare un paio di difficoltà
prima di poter scrivere qualche benchmark portabile. La prima difficoltà è la
mancanza del ciclo for, che è tipica dei linguaggi funzionali;
la seconda difficoltà è che non esiste un modo completamente portabile
per scrivere un modulo, anche se l’R6RS ci arriva vicino.

[Read more…]

Le avventure di un Pythonista in Schemeland /3

Nelle puntate precedenti mi sono limitato a discutere alcuni aspetti "di
contorno" del linguaggio Scheme: disponibilità di librerie,
affidabilità delle implementazioni, supporto in caso di bugs,
eccetera. In questa puntata invece affronterò alcune tematiche più
inerenti al linguaggio, come la sintassi, il modo di programmare e la
filosofia generale. Comincierò con una discussione delle famigerate
parentesi, che da sempre sono oggetto di innumerevoli discussioni:
dopotutto, come probabilmente saprete, LISP sta per
Lots of Irritating Superfluous Parenthesis, e Scheme ha ancor
più parentesi di altri Lisp!

[Read more…]

Le avventure di un Pythonista in Schemeland /2

Scheme è un linguaggio con molte implementazioni e con poche librerie.
In questa puntata discuterò un pò la situazione corrente e darò qualche
consiglio utile al programmatore Scheme principiante.

[Read more…]

C# e il suo futuro

Sogno il giorno in cui la smetteremo di farci la pelle per la tipizzazione dinamica, statica, esplicita, per l’inferenza dei tipi, la compilazione oppure l’interpretazione. Sogno un mondo in cui ogni programmatore possa scegliere il linguaggio che più gli aggrada solo per la sintassi e si ritrovi ogni genere di feature a sua disposizione.

Ok, sto decisamente scherzando. Sarebbe la morte delle diversità, delle guerre di religione, la rivincita di Mozart/Oz. La cosa che però penso ci metta tutti d’accordo è vedere quanto è bello quando il linguaggio X prende in prestito le cose interessanti da Y (senza peggiorarle magari…).

[Read more…]

Le avventure di un Pythonista in Schemeland /1

Questo è il primo di una serie di articoli che raccontano le mie esperienze con il linguaggio Scheme, venendo da Python. Lo scopo di questa serie non è tanto quello di insegnare Scheme (anche se leggendo questi articoli qualche cosa si dovrebbe imparare) quanto quello di allargare gli orizzonti per chi non conosce altro che i linguaggi più gettonati.

[Read more…]