Archivi Categorie: Lisp

Sweet, il Lisp e le parentesi

Io Twitter lo lovvo, assay ❤️ e quando trovo roba che m’ispira poi ne scrivo qui sul blog. Come il recente post Ricorsività e specialità.

Devo vedere Sweet concludevo e allora ecco cosa ho trovato.

La home di Sweet su SourceForge lo presenta come Readable Lisp/S-expressions with infix, functions, and indentation, brought to you by dwheeler.

Uh! chi è l’autore? Eccolo: David A. Wheeler, trovato via Twitter dove posta poco ma rockz! 💥

Le caratteristiche del progetto sono:

  • Infix notation, e.g., {3 + 4} in addition to (+ 3 4)
  • Optional traditional function notation, e.g., f(...) in addition to (f ...)
  • Optional indentation support greatly reduces the need for parentheses
  • Works on any data or program (it is general and homoiconic)

Poi c’è la pagina della Wiki, dice tutto (ahemmm…) e riporta un esempio molto simile a quello di Michael da cui sono partito nel post precedente.

La versione ortodossa della funzione fattoriale:

(define (factorial n)
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))))

e quella Sweet:

define factorial(n)
  if {n <= 1}
    1
    {n * factorial{n - 1}}

Tolte tutte le parentesi tonde tranne quelle per il passaggio degli argomenti. Uso delle graffe per la notazione infissa.

È più leggibile? forse, dipende dall’abitudine.
Personalmente penso a come costruisco una funzione Lisp (in realtà per me Racket) dal di dentro, le parentesi le apro sempre in copia, così () e sulla carta. Poi nell’ambiente DrRacket, ma anche tanti altri editors, viene indicata la corrispondente aperta/chiusa.

Anche sulla notazione infissa rispetto alla prefissa sono indeciso:

ecco, non è la notazione cui siamo abituati, quella che ci insegnano nella scuola; invece:

😉 Che poi è questione di convenzione, esempio:

e

e anche

Ammetto che dc oggi è solo una provocazione. O no? le calcolatrici HP, la mitica 11c.

Concordo con Jesse Alama, qui (non ho trovato il cinguettio cui si riferisce), e qui, con un opportuno adattamento: sed 's/God/FSM/'.

Una definizione meravigliosa

Da piccolo avevo un terminale collegato a un mini (per i giovani: un armadio con qualche terminale dumb collegato via  RS232  seriale, una stampante a catena, un hard disk di ben 80 MB, roba come il mitico PDP 11; in realtà Pr1me 550) con il Fortran. OK, c’era anche qualcos’altro, l’assembler PMA, e il CPL (un linguaggio di scripting interpretato che serviva per via che la shell (che non si chiamava così) non era programmabile). Erano tempi pre-Unix, anzi il PrimOS era un derivato di Multics. Una nota ancora per i giovani: io sto barando, tutte le sigle e i nomi dovrei scriverli tutto maiuscolo.

Poi a un certo punto è arrivato un Basic, atipico, mai usato. Invece leggendo il GEB mi viene la voglia, chiedo al tecnico (allora l’assistenza era indispensabile, costava anche cara) e ottengo un nastro con il Lisp, il Pascal e forse altro ancora che adesso non ricordo. Il Pascal l’ho provato per un po’ la sera con uno studente ma chi m’intrigava era il Lisp. Ci sono dei siti (per esempio qui e qui) con raccolte di documentazione dell’epoca ma del Lisp non ho trovato traccia. Forse era solo una beta o qualcosa di non ufficiale. Chissà.

Ci ho passato un po’ di sere con manuali fotocopiati dopo ricerche varie: “cos’è che hai in mente di fare?”, “perché?”, “ma fare come fanno tutti (cioè in Fortran)…”.

Insomma quella voglia mi è rimasta, tanto che poi ho provato anche con versioni più serie (sì, CL (Common Lisp)) su altre macchine. Ma non ho mai prodotto niente di usabile. Fino a quando uscito dal mondo del lavoro e con Linux ho trovato un’infinità di risorse. Ne ho utilizzato diverse versioni, anche eretiche. Poi sono passato a Scheme, cioè Racket. Una meraviglia. Adesso che sono alle prese con Haskell non devo pensarci troppo altrimenti mi viene il magone.

Non l’ho dimenticato, è sempre nella mente e nel cuore (ahemmm…). E oggi questa definizione, un cinguettio così bello che lo copio e metto nel blog per non dimenticarlo:

Lisp is a recognition that whoever designed the language doesn’t know what problems you’d want to solve with it; so you may want to change the language.

La cit. è di Will Byrd, dovrebbe essere quello di The Reasoned Schemer, c’è anche su Twitter, cercando il tweet ho deciso di followarlo. Non ho trovato invece la fonte iniziale.

Tornando alla cit. bella vero? Tutto anche per via delle macro, mooolto diverse da quelle del C.

Ah! già che si parla del meglio questo potrebbe essere ancora migliore, lollando, così:

L’amico Edo dopo aver letto la bozza mi guarda perpluto. Probabilmente –quasi certamente– ha ragione. Quando io ho cominciato il computer era una cosa non da tutti ma a breve sarebbe sbocciata la rivoluzione dei personal. Oggi poi siamo nella maturità della successiva, quella dei telefoni. Per la programmazione poi l’evoluzione non è stata come pensavo, come i lispers pensavano; anche se non si sono estinti, il tweet viene dalla setta dei clojuristi. E mica finisce qui, Edo e voi giovani ne vedrete delle belle (no, non la robocalypse).

👽

biwas di BiwaScheme un interprete Scheme in JavaScript

biwascheme_logo
Sono sempre intrigato dagli interpreti, ne ho parlato qui.

Bello provarli online, ma non solo, prendi BiwaScheme. Mysteryouso e intrigousassay 😯

Intanto c’è un gruppo su G+, da perlustrare — messo tra le cose da fare.
bws
Ma prima di subito si può scaricare l’interprete e installarlo in locale. Serve Node.js, è scritto in JavaScript.
E volendo si può anche modificare, personalizzare. Io ho cominciato con togliere metà del banner:

bs0

è stato sufficiente commentare la riga 103 del file /usr/local/lib/node_modules/biwascheme/bin/biwas così:

  var prompt = prompts.base;
  rl.setPrompt(prompt);

  console.log('BiwaScheme version ' + BiwaScheme.VERSION);
  //console.log('try (+ 1 2), etc. (Ctrl-D to exit)');

  BiwaScheme.Port.current_input = new BiwaScheme.Port.CustomInput(

Facile vero? volendo si può cambiare anche il prompt, mettere qualcosa come bs > per esempio. Basta ricordarsi che occorre sudo, siamo in /usr.

E nella directory cosa non si trova! non sempre facile, ma ci sono i commenti. Ma sono in giapponese 😜

Yutaka Hara è presente qui e qui –e altri posti ancora ma meno accessibili, ho carenze linguistiche, parlo principalmente piemonteis (pron. piemuntèis) dei contadini della zona di Carmagnola 😙

Maggiori info si BiwaScheme si possono trovare in un post di Jakub Jankiewicz, qui: How to use and extend BiwaScheme.
In questo post ci sarebbero altre cose da approfondire, per esempio Dialog –manca solo il tempo.
Inoltre, da viebel | klipse (prossimamente…) un rapido approccio a Scheme, Interactive overview of Scheme’s semantics, complementare alle specifiche di Scheme, disponibili anche sulla home di Biwascheme, queste.
:mrgreen:

Perché i nomi delle variabili devono essere significativi

squirrelNon so se a voi capita mai di svegliarvi nel cuore della notte (le tre meno un quarto), senza un motivo particolare, niente brutti sogni, solo così. E non riuscire più a riaddormentarvi. E per giunta cominciare a lambiccare su un post di sessanta ore prima.
A me è successo questa notte e voglio devo raccontarlo a qualcuno. Tanto il blog lo leggono in pochi e dopo questo incipit diminuiranno ancora. Assay.

La storia è semplicissima, più semplice di come la ricordavo questa notte, questa:

s88

Sì, viene 12. Basta guardare le parentesi.
Anzi no, bisogna vederlo nella GUI, DrRacket:

debug

Uh! vediamo se ho capito per davvero: rinomino la x globale xg e quella locale xl, ottengo:

(define xg 2)
(let ((xl 3)
      (y (+ xg 2)))
  (* xl y))

sp

OK, così è chiaro (spero).
Ma mi resta un dubbio: è solo per rimarcare bene-bene la distinzione tra le variabili locali introdotte da let e quelle esterne o è una delle domande da fare all’esame allo studente rompipalle, dicendogli “l’abbiamo fatto anche a lezione, anzi c’è nel sillabario” (loro lo chiamano così).

ac
Quando ero piccolo agli esami di idraulica (tre se ricordo bene) andava di moda quello in figura (spoiler: Bernoulli, sempre lui).

Dubbio: chissà quanti punti ho perso con questo post? Ma posso ssmettere quando voglio. Probabilmente. Forse… 😳

:mrgreen:

L’Interprete Universale Lisp 1.5 in Racket

smiling-ew

Una cosa che si può trovare ontehtoobz da 10 giorni ormai ma metti che ancora non l’avete ancora incontrata…
Non ho alcun merito, indico solo l’URL a un post di Eugene Wallingford. Riguarda il Lisp, quello delle origini e quello di adesso (uno dei _).
Siccome wallingf sa spiegare molto meglio di me (ehi! è un prof | hey! it’s a Dr.), vi conviene andar qui: The Lisp 1.5 Universal Interpreter, in Racket.
Visto? L’ho provato anch’io; anzi ho tentato di eseguirlo nella REPL, senza successo (sono troppo niubbo) ma con DrRacket è OK:

ew-uli

Quale altro linguaggio è così versatile, autoridefinibile?
Eh… sapete come dicono loro a programmable programming language 😀

53335958

:mrgreen:

SICP – perché hanno smesso

area-51Una rassegna di cinguettii: uno, due e tre.

Io adesso sono alle prese con SICP, un po’ per volta, per quel che ne sono capace, roba da über-nerd ma piace anche a me che sono niubbassay 😳 😀
Adesso non è che mi monto la testa e pretendo di dire qualcosa di nuovo e importante, quello che segue è solo una considerazione mia personale, non esportabile, anzi vale solo per me.

In this talk at the NYC Lisp meetup, Gerry Sussman was asked why MIT stopped teaching the legendary 6.001 course, which was based on Sussman and Abelson’s classic text The Structure and Interpretation of Computer Programs (SICP). Sussman’s answer was that: (1) he and Hal Abelson got tired of teaching it (having done it since the 1980s). So in 1997, they walked into the department head’s office and said: “We quit. Figure out what to do.”
(da qui).

OK, allora: quindici anni (circa, ho finito i diti) a ripetere le stesse cose, anche se fondamentali diventa un po’ –come dire– avete presente il rosario?
E poi è vero: con il Web e conoscendo i posti adatti (Stack Overflow, p.es.) la prima cosa una delle prime cose quando si parte è googlare e vedere quello che già c’è. Perché c’è parecchia roba là in fondo (quasi-cit.).

E Python (o linguaggi affini), vero anche questo. Funziona anche se lento (ma volendo…) e ci sono un sacco –OOPS già detto 😳
Oppure Java al posto del C++ (nessuno usa più il C liscio, io poi avevo il K&R con la versione antica quella in cui dichiaravi i tipi fuori dalle parentesi degli argomenti). E non parlo di altri linguaggi perché non sono ripetitivo (non tanto comunque).
Poi c’è l’HTML e tools ad esso collegati (CSS, anche JavaScript che è un linguaggio solo sotto certi aspetti). E si fa tutto non per il desktop (lo uso solo più io) ma per il telefono che ha lo schermo piccolo ma una risoluzione da sogno. E tanta RAM, ci deve girare sopra cose che chi s’immaginava quando ero giovane (avevano ragione i miei genitori a farmi desistere dal ‘puter 😳 l’ho capito tardi ma adesso so che è così).

Sussman pointed out that engineers now routinely write code for complicated hardware that they don’t fully understand (and often can’t understand because of trade secrecy.) The same is true at the software level, since programming environments consist of gigantic libraries with enormous functionality.

Vero, tranne pochissimissimi che quelle librerie le scrivono, dai qualcuno ci dev’essere che le ha scritte!
E poi capita (è capitato a me recentemente) che il giorno prima della pubblicazione salta fuori un bug (in un caso molto particolare, improbabile ma possibile) che fa partire subito una revisione. Anche perché tutto resta in una versione beta perenne; e manca la documentazione.

OK, basta lamentarsi, d’altronde

Sussman admitted that the SICP curriculum was “more coherent” than what they have now and that they still don’t know what the right curriculum should be.

Io che ormai sono fuori continuerò con SICP, mi piace, tanto 😀
E sul post indicato una meraviglia:

The SICP video lectures by Sussman and Abelson from 1986 (given to HP) are also available.

Ne ho visto solo qualche pezzettino (ci vuole tempo) ma sono OK, proprio come le lezioni normali; e per quelli come me ci sono itranscipts, solo che è difficile seguire la lezione e il testo sotto contemporaneamente, il tempo come minimo raddoppia.

Infine: Sure. There are valid reasons to move beyond SICP. Discussione da seguire; io intanto continuo a trovare nuovi tweeps da followare :mrgreen:

Linguaggi di programmazione, una segnalazione

cs212b

Cosa non si trova nel Web! Io poi che non ho fatto la scuola giusta; cioè no, nel senso di sì, ho fatto la scuola giusta ma non quella che avrei voluto, quella per programmatori. Anche perché illo tempore i ‘puters erano molto diversi da quelli di adesso. E anche misteriosi: il primo che ha girato un mio programma non l’ho mai visto; scrivevi il programma (controllando bene), perforavi le schede nell’orario prefissato, avevi diritto a un tempo massimo che era –secondo il me di allora– troppo sotto il minimo ma –secondo il me di adesso– troppo grande; consegnavi il tutto al responsabile e tornavi dopo un paio di giorni; se era tutto OK ti ridava le schede e un paio di fogli di tabulato con il listato e l’output; se andava male l’output era una serie di scritte misteriose. Solo Fortran IV (1966).

Oggi invece –beh lo sapete tutti.
Vero che non devo dirvi nemmeno di Twitter che è come un party dove ci vai perché ti porta un amico che poi ti presenta gente che a loro volta, se vuoi, puoi conoscere, stai a sentire cos’hanno da dire, conosci altri –tutti più hyper-über-smart di te. Ovvio che c’è anche ci fa gossip, parla di calcio, dei marò, … Ma puoi scegliere.
Io per esempio seguo diversi hyper-über-smart molto più bravi di me. E recentemente ho trovato il prof Eugene Wallingford dell Università dell’Iowa (chissà dov’è quella roba lì?).

E pensa te –meravigliosa meraviglia qui– il prof mette online il corso CS3540 Programming Languages and Paradigms.

Chissà se posso sbirciare un pochino; se non se ne accorgono e mi cacciano a calci in cu quel posto là urlandomi che mi denunciano (chissà se capirei l’iowese?).

La prima lezione è OK, non mi hanno cacciato, insisto.
La seconda è ancora meglio: Learning a New Language: Racket.
Uh! la combinazione: Racket 😀 il mio nuovo linguaggio preferito (pari merito con altri Nmila, anzi un po’ di più di tutti gli altri). OK, c’era da aspettarselo, con Twitter ti autoselezioni i follower esaminando i followabili retwittati da chi già segui.

La faccio breve: conto di fare tutta la classe tutto il corso.
Inoltre nella seconda lezione ho trovato tante cose ma una in particolare mi ha incuriosito tanto da proporre su Facebook e Google Plus una domanda, questa:

Domanda per tutti ma in particolare per i mate:
da noi si fa così
  3 +
  5
 --
  8

mentre altri fanno così:
  3
+ 5
 --
  8

perché?
Perché io sarei con gli altri?
Sono solo io?
OK, è una domanda multipla, forse senza senso. Ma forse...
Chissà cosa ne pensano [segue elenco]

Si vede che la domanda era troppo vaga, sempre che avesse un senso; c’è stato chi si è avvicinato (MfM, Marco) ma non so se quello che dice Eugene (posso chiamare così il prof, non è che mi fa cacciare?) è condivisibile:

The prefix notation that Scheme uses has several advantages over other notations, such as infix:

Using prefix notation, we can have an arbitrary number of arguments without repeating the operator. For example, it is easy to write (+ 3 4 8 6 5 4 7 6 5 8 9) using prefix notation. In other notations, this expression would be longer and involve 11 – 1 = 10 operator symbols. (And, even worse, perhaps ten separate evaluations!) This, despite the fact that children as young as second grade learn how to operate on multiple values as a single operation:

               3
               4
               8
               6
               5
               4
               7
               6
               5
               8
             + 9
             ---
              65

Ecco, è vero? Fuori dal Lisp intendo. Cioè se scrivo la mia espressione così diventa più chiara l’operazione? Chiedo anche se questa può sembrare tutta una manfrina per propagandarvi Racket.
Ah! Racket viene aggiornato costantemente, per esempio l’operazione complicata portata come esempio restituisce il valore indicato dal prof nella REPL

repl

ma nell’IDE ottengo

Ge

e sì, proprio così:

repl2

:mrgreen:

SICP – pronto? via!

cover
Allora, da tanto che volevo farlo, forse oggi, …
Qui: Structure and Interpretation of Computer Programs – second edition di Harold Abelson and Gerald Jay Sussman with Julie Sussman.
Userò Racket, grazie a SICP Support for DrRacket di Neil Van Dyke.

La pagina iniziale da le istruzioni –semplicissime– per l’installazione del package richiesto, l’unica avvertenza è di lanciare DrRacket con sudo, deve installare 😀

OK, pronto? via!

Per prima cosa memorizzare:

OK, mi sa che non ho più scuse, respiro profondo e via!

I think that it’s extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun.

Dall’intro di Alan J. Perlis.

Poi si passa all’idice, Contents, URL da memorizzare: https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html, OK, fatto.

Bella anche la premessa, letta, davvero, giurin-giuretta 😀
Letta anche quella della seconda edizione, tiene conto dell’avvento del Web (sembra ieri):

The World-Wide-Web site www-mitpress.mit.edu/sicp provides support for users of this book. This includes programs from the book, sample programming assignments, supplementary materials, and downloadable implementations of the Scheme dialect of Lisp.

Poi ci sono i ringraziamenti, li leggerò offline, dal PDF, promesso e sono pronto per il primo capitolo. Prossimamente, qui 😀

LOL – Let Over Lambda

Quando uno ridefinisce così un acronimo universalmente riconosciuto al volo dev’essere un nerd davvero über. Ma ‘spetta’n’attimino: è un lisper, quelli che usano il programmable programming language, quello delle macro, quelle vere, mica la robetta di C/C++.
OK, adesso mi spiego 🙄
logoSto parlando di Doug Hoyte, ecco come si presenta, qui.
Sì ha un blog da seguire, cioè no, non è aggiornato, abbandonato. Anche la foto di allora è di quando era un über-nerd giovane. Adesso scrive su Hoytech che Feedly si rifiuta di RSSare. Da seguire autonomamente.

Anche perché la novità è non nuovissima ma di quelle ***BREAKING NEWS***: Let Over Lambda—50 Years of Lisp.

Un libro di quelli intimidatori per la mole, 384 pagine 15×23 cm, pieno di Common Lisp.
Poco per volta, per chi ha pazienza e pochi €, Doug lo sta mettendolo online; anche se è uno di quelli che qualificano la propria biblioteca 😉 ma attenti che se lo vedo lo prendo, vedo se ci sono segnalibri, lo apro e controllo sottolineature e note, nèh.

Io l’ho subito messo tra le cose da fare, non subitissimo ma abbastanza urgenti (non urgentissime). Altamente consigliato ai lispers tutti. E un ringraziamento particolare al prof Lipari 😀 che me l’ha segnalato.

:mrgreen:

Lisp – ecco Babbo Natale

Cioè non lui, o forse sì ma per interposte persone, stroia complicata adesso vi spiego, anzi riparto.

rainer-joswig_400x400Vi interessa il Lisp? Anche per l’aspetto storico, altrimenti oggi potete scegliere tra CL (common Lisp) e Racket (o più genericamente Scheme). Io di Racket mi sono preso una cotta con i controfiocchi 😀 über-bellissimissimo, e vedo spesso che si usa come intro alla programmazione in diversi posti sexy –ma sto andando OT.

Allora c’è Rainer Joswig che in questi giorni sta twittando link a millemila libri sul Lisp (tutti Springer finora ma chissà…).

Troppi per elencarli tutti, si può seguire herr Rainer (consigliato) o l’hashtag #lisp. Anzi no, da vedere tutti e due, sull’#hash si trovano altri lispers.

1500x500
Purtroppo il tempo è quello che è (come quantità e nel senso di fenomeno di derivazione termodinamica, non nel senso atmosferico) ma proposito per l’anno che viene: devo leggerli, attentamente, al rogo abbandono la narrativa tutta 😀