Nel 1986 al CWI, l’istituto nazionale di ricerca per la matematica e le scienze del computer olandese, Eddy Boeve, Frank van Dijk, Leo Geurts, Timo Krijnen, Lambert Meertens, Steven Pemberton e Guido van Rossum implementarono ABC con l’ambizione di farne un sostituto del Basic. Le prime versioni di ABC avevano nome B (da non confondere con il B predecessore del C v. par. 2.12.1), la versione attuale è la IV.
ABC è un linguaggio semplice, interattivo con sintassi guidata. ABC opera in spazi di lavoro, di fatto sono directory di disco, in cui mantiene persistentemente dati e funzioni.
Il linguaggio dispone di cinque tipi di dato, che
riconosce dal contesto in cui sono usati:
· Numeri. Sono di due tipi, esatti ed approssimati, il primo tipo è memorizzato come una coppia di interi, numeratore e denominatore. Le funzioni sui numeri sono numerose, fra queste /* e */ forniscono i due valori associati ai numeri esatti:
>>> PUT 10.23 IN x
>>> WRITE */x, /*x, x
1023 100 10.23
· Stringhe. Sono relativamente povere di funzioni ed operatori, in particolare ^ (str1^str2) unisce due stringhe, @ (str@n) produce la sottostringa senza i primi n-1 caratteri, | (str|n) produce la sottostringa con i primi n caratteri, <<, >< e >> trasformano una variabile in stringa di una assegnata dimensione, inserendola rispettivamente a sinistra, al centro, a destra:
>>> WRITE
".."^(123>>5)^".."
.. 123..
· Compounds o records. Sono insiemi di campi, accessibili tramite assegnazione ad un corrispondente numero di variabili; ad esempio la funzione now fornisce un record con le sei componenti dell’attuale data e ora:
HOW TO RETURN oggi:
PUT
now IN anno, mese, giorno, ora, minuto, secondo
PUT '
genfebmaraprmaggiulugagosetottnovdic'@(mese*3)|3 IN mm
RETURN (giorno<<2) ^
" " ^ mm ^ (anno>>5)
>>> WRITE oggi
9 ott 2002
· Liste. Insiemi ordinati di dati omogenei; la posizione di un elemento nelle lista può variare a seguito di inserzioni o rimozioni. L’operatore di range genera una lista: {1..10}; ciò è utile per utilizzare l’istruzione FOR variab che di per se opera solo su liste (gli elementi della lista sono nella variabile locale variab)
· Tavole. Coppie di informazioni chiave – valore; la funzione keys trasforma le chiavi in una lista ordinata. I valori di una tavola possono essere tipi qualsiasi; le chiavi devono essere dello stesso tipo.
Le variabili all’interno delle funzioni sono locali a meno di dichiarazione share.
I blocchi di programma relativi a istruzioni condizionali o a funzioni, iniziano con : (due punti) e sono indentate.
HOW
TO RETURN oggi: ... vedi esempio precedente HOW TO
RETURN giorno n: RETURN
' lunmarmergiovensabdom'@(n*3)|3 HOW TO RETURN str right n: RETURN str@(#str-n+1) |
La sintassi degli operatori è coerente, gli unari
sono prefissi, i binari sono infissi; questa regola vale anche per le funzioni
ed i predicati dichiarati, la cui sintassi è rispettivamente:
HOW TO RETURN [vrb] (fnz [vrb]):
HOW
TO REPORT [vrb] (fnz [vrb]):
La sintassi per le procedure è: HOW TO NOMEPROCEDURA [param1, param2, ...]:.
Il linguaggio è gradevole da utilizzare, soffre di
alcune limitazioni, oltre quelle già accennate: manca l’accesso a funzioni
esterne, la gestione di files, la possibilità di inserire commenti, una
funzione di valutazione di istruzioni autocostruite, ora limitata a quelle
inserite da tastiera tramite l’istruzione: READ nomevariabile EG esempio_di_tipo_di_dato
>>> READ duepi EG 1
2*pi
>>> WRITE
"duepigreco =", duepi
duepigreco = 6.283185307179586
Nell’esempio che segue da una tabella con record coppie
di città e loro distanza, genera un tabella con chiave città e valore la lista
delle città direttamente raggiungibili:
HOW TO NODI:
SHARE distanze
PUT {}IN nodi
FOR i IN keys distanze:
PUT distanze[i] IN da, a, km
INSERTNODO nodi, lower da, lower a
INSERTNODO nodi, lower a, lower da
WRITE "--- Record distanze ---"/
DISPLAY distanze
WRITE "--- Tabella nodi ---"/
DISPLAY nodi
HOW TO INSERTNODO tab, da, a:
IF da not.in keys tab:
PUT {} IN tab[da]
PUT tab[da] IN lista
INSERT a IN lista
PUT lista IN tab[da]
HOW TO DISPLAY tavola:
FOR chiave
IN keys tavola:
WRITE chiave<<10,
tavola[chiave] /
L’esecuzione produce:
>>> NODI
--- Record distanze ---
1 ("Torino",
"Milano", 130)
2 ("Torino",
"Casale", 60)
3 ("Casale",
"Pavia", 40)
4 ("Casale",
"Milano", 80)
5 ("Milano",
"Mantova", 70)
6 ("Pavia",
"Mantova", 50)
7 ("Torino",
"Asti", 50)
8 ("Asti",
"Casale", 30)
9 ("Asti",
"Pavia", 50)
--- Tabella nodi ---
asti {"casale"; "pavia";
"torino"}
casale {"asti"; "milano";
"pavia"; "torino"}
mantova {"milano"; "pavia"}
milano {"casale"; "mantova";
"torino"}
pavia {"asti"; "casale";
"mantova"}
torino {"asti"; "casale";
"milano"}