Addio dc, benvenuta luka: una nuova calcolatrice RPN da Terminale
La Notazione Polacca Inversa (o RPN, dall’inglese Reverse Polish Notation) è un modo per eseguire operazioni matematiche senza usare le parentesi. Negli anni ‘70-80 l’RPN fu resa popolare da Hewlett-Packatd (HP), che l’utilizzò in tutte le sue calcolatrici scientifiche e finanziarie.
Con le calcolatrici della rivale Texas-Instruments, che usavano le parentesi, era facile perdere il conto di quante parentesi si erano aperte o chiuse, cosa che costringeva spesso a reinserire l’intera espressione dal principio. Chi usava una calcolatrice RPN non aveva questi problemi, anche se doveva superare un piccolo scoglio iniziale per abituarsi alla nuova notazione.
Oggi le calcolatrici fisiche sono poco usate, e quasi tutti preferiscono utilizzare un’app sul telefono o sul computer. Ma c’è ancora qualche nerd impenitente che non si arrende all’interfaccia grafica e si ostina ad usare il Terminale. Perché? Ad esempio, perché è molto più facile inserire numeri e operazioni complicate con la tastiera, che premere i tasti di vetro di una calcolatrice virtuale.
Premessa
Se avete fretta e non volete sobbarcarvi la lettura di questo lungo articolo, troverete tutte le informazioni che vi servono in questo post, sintetico ma come sempre brillante, su Quickloox, uno dei blog di riferimento per chi è appassionato del mondo Apple.
– Immagine generata da Google Gemini.
Un po’ di storia
La Polonia ci ha dato Niccolò Copernico, Fryderyk Chopin, Joseph Conrad, Marie Curie, Arthur Rubinstein, Stanislaw Lem. Ma ci ha dato anche Jan Lukasiewicz, un logico matematico (e filosofo) che cent’anni fa inventò una notazione matematica che non faceva uso di parentesi.
In questa notazione polacca tutti i simboli di operazione ( \( + \), \( - \), \( \times \), \( / \) ) precedono i numeri a cui si applicano. Lo stesso vale più in generale per le funzioni matematiche, come \( \sqrt{} \), \( \sin \), \( \cos \), \( \exp \) (dette operatori) e i numeri o le variabili (dette operandi) su cui agiscono.
Ad esempio, una operazione come \( 3 + 4 \), in notazione polacca viene scritta \( + \ 3 \ 4 \), mentre \( (5 + 2) \times (5 - 2) \) diventa \( \times + 5 \ 2 - 5 \ 2 \).
Per molti anni questa è rimasta solo una idea un po’ bislacca, perché il vantaggio di non usare le parentesi non sembrava compensare a sufficienza la notazione inusuale e più difficile da leggere.
Poi alla fine degli anni ‘50, John McCarthy rispolverò la notazione polacca (o prefissa) per il LISP, uno dei linguaggi di programmazione più influenti di tutti i tempi,1 sviluppato con l’obiettivo di essere applicato allo sviluppo di programmi nell’ambito della nascente intelligenza artificiale.
La notazione prefissa, infatti, non solo semplificava notevolmente la scrittura dell’interprete LISP, ma permetteva anche di rappresentare allo stesso modo sia il codice che i dati, una cosa utilissima per un linguaggio finalizzato a rendere in computer intelligente. Ma meglio non divagare troppo.
Notazione polacca inversa
Ma la vera svolta avviene invertendo l’ordine fra operandi ed operatori, cioè scrivendo prima i numeri e poi le operazioni da eseguire, per cui \( 3 + 4 \) diventa \( 3 \ 4 \ + \) e \( (5 + 2) \times (5 - 2) \) diventa \( \ 5 \ 2 + 5 \ 2 - \times \).
Questa notazione polacca inversa (RPN) viene scoperta e riscoperta per almeno tre volte in vent’anni, ma diventò popolare solo all’inizio degli anni ‘60 quando Friedrich Bauer, inventore del concetto di stack e uno degli sviluppatori dell’ALGOL, e Edsger Dijkstra, famoso per la soluzione del “problema del cammino minimo” e per mile altre cose, ripresero in mano il concetto, perché permetteva di ridurre l’accesso alla memoria, che nei computer dell’epoca era scarsa e lenta, e di eseguire tutte le operazioni in un’area di memoria bene definita (lo stack) e per questo più facile da manipolare.
I vantaggi dell’RPN per eseguire i calcoli matematici erano così evidenti che HP la utilizzò in praticamente tutte le sue calcolatrici scientifiche e finanziarie, almeno fino all’inizio degli anni ‘90. Solo con lo sviluppo di memorie più capienti e di display molto più grandi divenne possibile visualizzare e modificare facilmente l’intera operazione impostata – e non più solo l’ultimo numero inserito – rendendo così meno necessario l’uso dell’RPN.
Una calcolatrice nel Terminale
Chi vuole usare una calcolatrice tradizionale nel Terminale di macOS o di Linux ha una scelta pressoché obbligata: bc, il basic calculator, presente in UNIX dal 1975, 50 anni filati. La versione attuale, disponibile su Linux e macOS, è stata completamente riscritta, ma quella originale era solo una interfaccia per dc (desk calculator), una delle più antiche utility presenti in UNIX e più vecchia persino del C.
E dc era… una calcolatrice RPN. Una scelta che confermava l’intuizione di HP: la notazione RPN era più efficiente e più semplice da implementare, e quindi ideale anche per i computer dalle risorse limitate degli anni ’70.2
Oggi l’RPN non è più una scelta quasi obbligata dalle limitazioni hardware, ma direi una scelta motivata soprattutto dalla pigrizia. Perché, una volta che si è spesa una mezz’oretta per imparare ad usarla, si scopre che è davvero molto più comodo eseguire i calcoli con questa notazione piuttosto che con quella tradizionale.
E poi forse c’è anche un certo gusto per andare controcorrente: in un mondo in cui tutti si uniformano ai dettami degli influencer (veri o presunti) sui social, usare una calcolatrice RPN diventa un modo per distinguersi, per sentirsi fuori dal coro, quasi una dichiarazione di indipendenza intellettuale.
dc è ancora presente in Linux e macOS e può essere tranquillamente usata dal Terminale, ma è una bella fatica, i suoi cinquant’anni si sentono (e si vedono) tutti. I risultati delle operazioni non si vedono, a meno di non stamparli sullo schermo con p. Nemmeno lo stack si vede, a meno di non chiederlo esplicitamente con f. I numeri negativi si indicano con l’underscore _ e non con il normale -, per cui \( - 4 \) si scrive \( \_4 \). E così via.
Ma da oggi c’è dc2 o meglio, luka.
La calcolatrice RPN del XXI secolo
E sì, perché da qualche settimana abbiamo a disposizione una nuova calcolatrice RPN per il Terminale di macOS di Linux, chiamata inizialmente dc2, in omaggio alla veneranda calcolatrice ormai ultracinquantenne.
Però dc2 sapeva troppo di una riscrittura dell’originale, mentre questo è un progetto completamente nuovo, scritto da zero in C. Meritava quindi un nome tutto suo, luka, in omaggio a Jan Lukasiewicz, l’inventore della notazione polacca (si veda il riquadro qui sopra).
Rispetto a dc, luka è davvero di un’altro secolo, e si vede appena si inizia a provarla. È interattiva, mostra in ogni momento il contenuto dello stack, ha la storia delle operazioni eseguite, le variabili, un help sintetico ma completo in linea, una pagina di manuale cristallina (ce ne fossero tante altre così!).


E poi luka è fatta in Italia. In tempi in cui si esalta l’identità nazionale per i motivi più futili, è bello vedere qualcosa che merita davvero di essere valorizzato.

Il programma in questo momento ha un piccolo bug legato alla visualizzazione dell’history, ma l’autore macina il codice molto più velocemente di quanto io macini le parole, per cui è più che probabile che il bug sarà corretto al più presto (vacanze permettendo).
Evoluzione del codice
Lo sviluppo di dc2/luka è stato rapidissimo. Dietro al progetto c’è Davide Mastromatteo, noto fra i suoi amici di penna come @mastro35 e autore dell’ottimo blog The Python Corner.
In pochi giorni Davide è passato dalla versione 0.1.0, perfettamente funzionale ma con una interfaccia utente ancora acerba,


alla versione 0.2.0, con una vista dello stack molto più chiara, la possibilità di usare gradi e radianti e di cambiare il formato di rappresentazione dei numeri, nonché con un help più compatto.


La versione 0.3.0 ha introdotto l’history delle operazioni eseguite e un help ancora rivisto,


mentre la versione 0.4.0, che è coincisa con il cambio di nome del programma, ci ha portato le variabili e parecchi nuovi comandi da tastiera, come si può vedere nelle prime immagini di questo articolo.
Usare luka
Installare luka sul Mac o su Linux è un attimo, almeno per chi usa homebrew (e chi non lo usa dovrebbe iniziare a farlo subito)
brew install mastro35/homebrew-mastro35/luka
Altrimenti basta scaricare l’ultima release del codice sorgente, scompattarla ed eseguire
make clean && make
dal Terminale, ovviamente dopo essersi spostati nella directory che contiene il codice sorgente.3
Inutile dire che chi ha installato make e un compilatore C su Windows, potrà compilare luka anche su questo sistema operativo.
Dimenticavo: presto arriveranno i pacchetti per Linux, in formato deb e rpn e, chissà, magari anche aur. E forse anche un installatore per Windows.
Sull’uso vero e proprio della calcolatrice c’è poco da dire. Chi conosce già l’RPN si troverà a suo agio, e ci metterà pochissimo ad usare luka al meglio. Chi non conosce l’RPN magari avrà voglia di provarla, per toccare con mano quanto sia più comodo eseguire un calcolo appena appena complicato con una calcolatrice RPN piuttosto che con una normale calcolatrice algebrica.
Di guide all’RPN ce ne sono a iosa, purtroppo sono tutte orientate a spiegarne l’uso con una calcolatrice fisica, come le ormai mitiche HP vintage, oppure con le emulazioni grafiche per Android o iOS.4
Rispetto a queste guide ci sono alcune differenze da considerare. La principale è che, non avendo i tasti fisici, luka (ma anche dc) richiede che si prema ogni volta ENTER per inserire un numero o una funzione. Anche alcuni nomi di funzioni sono diversi, così come i comandi per gestire lo stack o per salvare e recuperare le variabili. Ad esempio luka usa store e load per le variabili, mentre le calcolatrici fisiche o emulate usano dei tasti denominati in genere STO e RCL (ma se l’autore legge questo articolo forse cambierà idea 😂). Ma, a parte questi dettagli, la logica di fondo non cambia.
Da parte mia, ho provato in tutti i modi a far andare luka in crash, e non ci sono mai riuscito. Ho provato a fargli calcolare il fattoriale di numeri assurdamente grandi o piccoli, a dividere per zero, ad eseguire il famigerato \( 0 / 0 \) e poi a calcolare il reciproco del risultato. Ma niente, imperturbabile mi ha sempre dato il risultato esatto. Insomma, la qualità c’è.
Conclusioni
Provare luka non costa niente. Si installa (e disinstalla) in pochi secondi, funziona su macOS, Linux e, per chi vuole, anche su Windows. I risultati che produce sono esatti (e questa è la cosa che conta di più). Lo sviluppatore è bravo ed aperto ai suggerimenti. Insomma, è uno strumento ideale per chi vuole eseguire dei calcoli dal Terminale.
Certo, è uno strumento di nicchia, destinato a pochi utenti sofisticati che apprezzano la notazione RPN e non hanno paura del Terminale. Ma proprio per questo ha un fascino tutto suo.
E poi, vuoi mettere la bellezza di vedere un programma che evolve davanti ai nostri occhi, magari partecipando allo sviluppo con suggerimenti o critiche?
-
Ed uno dei pochi linguaggi di programmazione, assieme a FORTRAN e COBOL, ad essere ancora vivo e vegeto. ↩︎
-
Non a caso, uno dei linguaggi di programmazione più efficienti in assoluto è il FORTH, che si basa sullo stack e sull’uso dell’RPN. ↩︎
-
Come, non avete nemmeno
make? Allora correte ad installarehomebrew! ↩︎ -
Per quest’ultimo consiglio senza riserve PCalc Lite o meglio ancora la versione full Pcalc, che costa quanto un panino e una minerale al bar. In alternativa WP 34s, che riesce a compattare tutto in una sola schermata, oppure i41CX, perfetta per chi a suo tempo sognava di averla. ↩︎
IT
EN