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…]

Le avventure di un Pythonista in Schemeland/8

Come promesso, in questa puntata parlerò di macro. Le macro di Scheme
sono particolarmente avanzate, di gran lunga più sofisticate di quelle
del Lisp e di qualunque altro linguaggio ed hanno una reputazione di
formidabile complessità. Per essere più precisi,
Scheme ha due sistemi di macro inclusi nello standard (più molti altri
sistemi più o meno diffusi): le macro basate su syntax-rules, che
sono di potere limitato ma relativamente semplici, e le macro basate su
syntax-case, che sono potentissime ma decisamente più complesse da
utilizzare. In questo puntata darò soltanto degli esempi di macro
basate su syntax-rules, assieme ad una minima discussione sui
pro e contra delle macro.
Prendete un bel respiro e allacciatevi le cinture che si parte!

[Read more…]

Le avventure di un Pythonista in Schemeland/7

Alcuni lettori mi hanno chiesto se c’è qualche libro
per imparare Scheme che io consiglio particolarmente. In effetti
esistono molti buoni testi, ma nessuno che mi soddisfa al cento per cento
e che io raccomanderei senza riserve ai lettori di Stacktrace.
Questo è il motivo per cui finora sono stato restio a
parlare di bibliografia. C’è anche da dire che io sono uno di quelli che impara
dai manuali e dai newsgroup più che dai libri, quindi non sono ferratissimo
sulla letteratura esistente. Io qui citerò soltanto risorse disponibili in rete.
I lettori che ne sanno più di me in materia di letteratura sono caldamente
invitati a postare le loro raccomandazioni come commenti a questa puntata.

[Read more…]

Le avventure di un Pythonista in Schemeland /6

Dopo cinque puntate introduttive è finalmente arrivato il momento
di fare sul serio. In questa puntata e nella prossima getteremo le basi
per capire cosa stia dietro al celebre motto del Lisp code is data,
che molti considerano il cuore e l’anima del Lisp.
Come sempre, capire richiede qualche preliminare. In questa puntata
descriveremo due tipi di dati fondamentali del Lisp (e quindi
di Scheme): i simboli e le liste. Nella prossima discuteremo
l’operazione di quoting che permette di trasformare un frammento di
codice in una lista di simboli e valori primitivi (cioè converte
codice in dati) e l’operazione di eval che permette di eseguire una
qualunque lista di simboli e valori primitivi corrispondente a codice valido
(cioè converte dati in codice).

[Read more…]

Il futuro de “Le avventure di un Pythonista in Schemeland”

In un commento alla prima puntata delle mie “Avventure” dicevo che questa
era una serie di ampio respiro che ci avrebbe accompagnato per molte
puntate. Parlavo seriamente: in questo momento, dopo cinque puntate,
siamo soltanto alla conclusione dell’introduzione. La serie vera
comincia adesso
.

[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…]

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…]